84
85
86
87 USE spmd_comm_world_mod, ONLY : spmd_comm_world
88#include "implicit_f.inc"
89
90
91
92
93#include "com01_c.inc"
94
95#include "param_c.inc"
96
97#include "com04_c.inc"
98
99#include "spmd_c.inc"
100
101
102
103#include "spmd.inc"
104
105
106
107 CLASS(T_DIFFUSION) :: this
108 CLASS(T_LINEAR_SOLVER), INTENT(IN), TARGET :: LINSOL
109 INTEGER, DIMENSION(NPARG, NGROUP), INTENT(IN) :: IPARG
110 INTEGER, INTENT(IN) :: NRHS
111 TYPE(T_ALE_CONNECTIVITY), INTENT(IN) :: ALE_CONNECT
112
113
114
115 INTEGER :: MAT_NZ, NG, II, NEL, ITY, MATLAW, NFT, I, JJ, KK
116 INTEGER :: GLOB_DIM, MAX_ID, IAD, LGTH
117#ifdef MPI
118 INTEGER IERR
119#endif
120
121 this%NRHS = nrhs
122
123 mat_nz = 0
124 DO ng = 1, ngroup
125 matlaw = iparg(1, ng)
126 IF (matlaw == 151) THEN
127 nel = iparg(2, ng)
128 nft = iparg(3, ng)
129 ity = iparg(5, ng)
130 DO ii = 1, nel
131 i = ii + nft
132 mat_nz = mat_nz + 1
133 iad = ale_connect%EE_CONNECT%IAD_CONNECT(i)
134 lgth = ale_connect%EE_CONNECT%IAD_CONNECT(i+1)-ale_connect%EE_CONNECT%IAD_CONNECT(i)
135 DO jj = 1, lgth
136 kk = ale_connect%EE_CONNECT%CONNECTED(iad + jj - 1)
137 IF (kk > 0) THEN
138 mat_nz = mat_nz + 1
139 ENDIF
140 ENDDO
141 ENDDO
142 ENDIF
143 ENDDO
144
145 CALL this%MAT%MATRIX_CREATE(mat_nz)
146
147 CALL this%RHS%CREATE(nrhs * numels)
148
149 glob_dim = numels
150 max_id = maxval(ale_connect%IDGLOB%ID(1:numels + nsvois))
151#ifdef MPI
152 IF (nspmd > 1) THEN
153 CALL mpi_allreduce(max_id, glob_dim, 1, mpi_int, mpi_max, spmd_comm_world, ierr)
154 ENDIF
155#endif
156
157 ALLOCATE(this%SOL(3 * glob_dim))
158
159 this%LINEAR_SOLVER => linsol
160 CALL this%LINEAR_SOLVER%INIT_SOLVER(glob_dim)
161
162 CALL this%LINEAR_SOLVER%SET_RHS(3, this%RHS)
163 CALL this%LINEAR_SOLVER%SET_MATRIX(this%MAT)
164
165 this%OUTLET_FLAGGED = .false.
166 IF (n2d == 0) THEN
167 ALLOCATE(this%NU(numels + nsvois))
168 this%NU(1:numels + nsvois) = zero
169 ALLOCATE(this%FLAG_OUTLET(6 * numels))
170 this%FLAG_OUTLET(1:6 * numels) = 0
171 ELSE
172 ALLOCATE(this%NU(numelq + numeltg + nqvois + ntgvois))
173 this%NU(1:numelq + numeltg + nqvois + ntgvois) = zero
174 ALLOCATE(this%FLAG_OUTLET(4 * numelq + 3 * numeltg))
175 this%FLAG_OUTLET(1:4 * numelq + 3 * numeltg) = 0
176 ENDIF
177
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)