MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
InitialGuess.F90
1 
2 
3 
4 
5 
10 
11 Subroutine forminitialguess(snes,X,ierr)
13 Use f90moduleinterfaces
14 
15 Implicit None
16 
17 
18 #include <finclude/petscsys.h>
19 #include <finclude/petscvec.h>
20 #include <finclude/petscvec.h90>
21 #include <finclude/petscdmda.h>
22 #include <finclude/petscdmda.h90>
23 #include <finclude/petscis.h>
24 #include <finclude/petscsnes.h>
25 #include <finclude/petscsnes.h90>
26 
27 ! Input/output variables:
28  snes snes
29  type(userctx), pointer:: puser
30  vec x
31  petscerrorcode ierr
32  dm da
33 
34 ! Declarations for use with local arrays:
35  petscscalar,pointer :: lx_v(:,:)
36  vec :: localx
37 
38  ierr = 0
39  call snesgetdm(snes,da,ierr)
40  call snesgetapplicationcontext(snes,puser,ierr)
41 
42 ! Get a pointer to vector data.
43  call dmgetlocalvector(da,localx,ierr)
44  !call VecGetArrayF90(localX,lx_v,ierr) !only for DOF=1
45  call dmdavecgetarrayf90(da,localx,lx_v,ierr)
46 
47 
48 
49 ! Compute initial guess over the locally owned part of the grid
50  call initialguesslocal(puser,lx_v,ierr)
51 
52 ! Restore vector
53  !call VecRestoreArrayF90(localX,lx_v,ierr) !only for DOF=1
54  call dmdavecrestorearrayf90(da,localx,lx_v,ierr)
55 
56 
57 ! Insert values into global vector
58  call dmlocaltoglobalbegin(da,localx,insert_values,x,ierr)
59  call dmlocaltoglobalend(da,localx,insert_values,x,ierr)
60  call dmrestorelocalvector(da,localx,ierr)
61 
62 End Subroutine forminitialguess
63 
64 
65 
66 
67 
70 
71 Subroutine initialguesslocal(user,rhop,ierr)
72 
73 !PETSc modules
74  use petscmanagement
75 !VLE and DFT modules
76  Use basic_variables, ONLY: ncomp,t,parame
77  Use eos_variables, Only:rho
78  Use vle_var, Only: rhob,tc
79  Use parameters, Only: pi
80  Use mod_dft, Only: box,zp,dzp
81  Use global_x, Only: ngrid
82 
83 
84  implicit none
85 
86 #include <finclude/petscsys.h>
87 #include <finclude/petscvec.h>
88 #include <finclude/petscdmda.h>
89 #include <finclude/petscis.h>
90 #include <finclude/petscmat.h>
91 #include <finclude/petscksp.h>
92 #include <finclude/petscpc.h>
93 #include <finclude/petscsnes.h>
94 
95 ! Input/output variables:
96  type(userctx) :: user
97  petscscalar :: rhop(ncomp,user%gxs:user%gxe)
98  petscerrorcode :: ierr
99 
100 
101 ! Local variables:
102  petscint i,k
103  petscbool flg
104  REAL :: arg
105  INTEGER :: pert
106  REAL :: tanhfac
107  REAL :: zp_i
108  REAL :: zp_middle
109 
110 
111 
112 !normal or perturbed inital profile?
113  call petscoptionsgetint(petsc_null_character,'-init_pert',pert,flg,ierr)
114 
115 
116  zp_middle = (ngrid/2)*dzp
117  tanhfac = -2.3625*t/tc + 2.4728
118 
119 
120  !default: no perturbation, start with bulk density
121 
122 
123 IF(user%num_procs == 1) THEN !if only one processor involved
124 
125  Do k = 1,ncomp
126  Do i=user%gxs,user%gxe !proc 0 has to calculate values for ghost points out of physical domain (from -irc to -1 and discret to discret+irc) and its regular part
127  zp_i = zp(i)
128  rhop(k,i) = ( tanh(-(zp_i -zp_middle) / parame(k,2) *tanhfac) + 1.0 ) * rhob(1,k)/2.0 &
129  - ( tanh(-(zp_i - zp_middle) / parame(k,2) *tanhfac) - 1.0 ) * rhob(2,k)/2.0
130 !rhop(k,i) = rhob(1,k)
131  !make sure density is nonzero
132  If(rhop(k,i) == 0.0) rhop(k,i) = rhop(k,i-1)
133  End Do
134  End Do
135 
136 
137 
138 Else !parallel simulation
139 
140 
141 
142  IF(user%rank == 0) THEN !watch the user%xs vs user%gxs (first no ghost points, second with ghost points)
143 
144  Do k=1,ncomp !loop over dof = loop over components
145  Do i=user%gxs,user%xe !proc 0 has to calculate values for ghost points out of physical domain (from -irc to -1) and its regular part
146  zp_i = zp(i)
147  !perturb = (rhob(1,j)-rhob(2,j))/2.0 * i * (discret - i) / (damp*discret)**2
148  !rhop(k,i) = ( TANH(-(zp_i -zp_middle) / parame(k,2) *tanhfac) + 1.0 ) * rhob(1,k)/2.0 &
149  ! - ( TANH(-(zp_i - zp_middle) / parame(k,2) *tanhfac) - 1.0 ) * rhob(2,k)/2.0 !+ perturb
150 rhop(k,i) = rhob(1,k)
151  !make sure density is nonzero
152  If(rhop(k,i) == 0.0) rhop(k,i) = rhop(k,i-1)
153  End Do
154  End Do
155 
156 
157  ELSE IF(user%rank == user%num_procs-1) THEN
158 
159  Do k=1,ncomp !loop over dof = loop over components
160  Do i=user%gxs,user%gxe !last proc has to calculate values for ghost points out of physical domain (from discret to discret+irc) and its regular part
161  zp_i = zp(i)
162  !perturb = (rhob(1,j)-rhob(2,j))/2.0 * i * (discret - i) / (damp*discret)**2
163  !rhop(k,i) = ( TANH(-(zp_i -zp_middle) / parame(k,2) *tanhfac) + 1.0 ) * rhob(1,k)/2.0 &
164  ! - ( TANH(-(zp_i - zp_middle) / parame(k,2) *tanhfac) - 1.0 ) * rhob(2,k)/2.0 !+ perturb
165 rhop(k,i) = rhob(1,k)
166  !make sure density is nonzero
167  If(rhop(k,i) == 0.0) rhop(k,i) = rhop(k,i-1)
168  End Do
169  End Do
170 
171 
172  ELSE
173 
174  Do k=1,ncomp !loop over dof = loop over components
175  Do i=user%xs,user%xe !middle procs have to calculate only their regular part
176  zp_i = zp(i)
177  !perturb = (rhob(1,j)-rhob(2,j))/2.0 * i * (discret - i) / (damp*discret)**2
178  !rhop(k,i) = ( TANH(-(zp_i -zp_middle) / parame(k,2) *tanhfac) + 1.0 ) * rhob(1,k)/2.0 &
179  ! - ( TANH(-(zp_i - zp_middle) / parame(k,2) *tanhfac) - 1.0 ) * rhob(2,k)/2.0 !+ perturb
180 rhop(k,i) = rhob(1,k)
181  !make sure density is nonzero
182  If(rhop(k,i) == 0.0) rhop(k,i) = rhop(k,i-1)
183  End Do
184  End Do
185 
186  END IF
187 
188 
189 End If
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 ! If(pert == 1) Then
210 ! Do i=user%xs,user%xe
211 ! arg = zp(i) * PI / box
212 ! rhop(k,i) = rhob(1,k) + 0.5*rhob(1,k) * sin(arg)
213 ! End Do
214 ! End If
215 !
216 ! If(pert == 2) Then
217 ! Do i=user%xs,user%xe
218 ! arg = zp(i) * 2.0 * PI / box
219 ! rhop(k,i) = rhob(1,k) + 0.5*rhob(1,k) * sin(arg)
220 ! End Do
221 ! End If
222 !
223 ! If(pert == 3) Then
224 ! Do i=user%xs,user%xe
225 ! arg = zp(i) * 3.0 * PI / box
226 ! rhop(k,i) = rhob(1,k) + 0.5*rhob(1,k) * sin(arg)
227 ! End Do
228 ! End If
229 
230 
231 
232 
233 
234 
235 
236 
237 
238 
239 
240 
241 End Subroutine initialguesslocal
242 
243 
244 
245 
246 
247 
248 
249 
250 
251 
252 
253 
254 
255 
256 
257 
258 
259 
260 
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
Definition: modules.f90:6
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
Definition: modules.f90:120
This module contains variables associated with the PETSc solver.
Definition: mod_PETSc.F90:24
In this module, the application context is defined.
Definition: mod_PETSc.F90:7
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
Definition: modules.f90:29