4 SUBROUTINE backup_suite(type_fic, filename, n_it, rank, is_sequential)
7 CHARACTER(len=3),
INTENT(IN) :: type_fic
8 CHARACTER(len=200),
INTENT(IN) :: filename
9 INTEGER,
INTENT(IN) :: n_it, rank
10 LOGICAL,
INTENT(IN) :: is_sequential
12 CHARACTER(len=3) :: tit_s, tit
13 CHARACTER(len=5) :: name_it, name_dom
15 CHARACTER(len=200) :: cmd, dir_out
17 WRITE(tit_s,
'(i3)') rank
22 IF (is_sequential)
THEN 24 dir_out=
'NON_PETSC_OUT/' 29 WRITE(tit,
'(i3)') n_it
35 IF (type_fic==
'mxw')
THEN 36 cmd =
'mv suite_maxwell' 37 ELSE IF (type_fic==
'nst')
THEN 40 WRITE(*,*)
'WARNING: exit without doing anything (backup_suite)' 44 cmd = trim(adjustl(cmd))//trim(adjustl(name_dom))//name_it//
'.'//trim(adjustl(filename))
45 WRITE(*,*)
'('//trim(adjustl(cmd))//
')' 47 IF (is_sequential)
THEN 48 IF (rank==0)
CALL system(trim(adjustl(cmd))//
' '//trim(adjustl(dir_out)))
50 CALL system(trim(adjustl(cmd))//
' '//trim(adjustl(dir_out)))
56 #include "petsc/finclude/petsc.h" 59 INTEGER,
DIMENSION(:) :: cont
60 INTEGER,
DIMENSION(:),
ALLOCATABLE :: tmp
63 petscerrorcode :: ierr
68 CALL mpi_allreduce(cont, tmp, np, mpi_integer, mpi_sum, comm, ierr)
75 #include "petsc/finclude/petsc.h" 78 REAL(KIND=8),
DIMENSION(:,:,:) :: field
79 REAL(KIND=8),
DIMENSION(:,:,:),
ALLOCATABLE :: tmp
80 INTEGER :: np, i, j, n2, n3
81 INTEGER,
DIMENSION(:),
OPTIONAL :: cont
84 petscerrorcode :: ierr
90 ALLOCATE(tmp(np, n2, n3))
95 CALL mpi_allreduce(field(:,i,j), tmp(:,i,j), np, mpi_double_precision, mpi_sum, comm, ierr)
98 IF (
present(cont))
THEN 101 field(:,i,j) = tmp(:,i,j)/cont(:)
118 REAL(KIND=8),
DIMENSION(:,:,:) :: in_field, out_field
119 INTEGER,
DIMENSION(:) :: l_t_g
121 INTEGER :: i2, i3, n1, n2, n3, m1, n
125 n1 =
SIZE(in_field,1)
126 m1 =
SIZE(out_field, 1)
127 n2 =
SIZE(in_field, 2)
128 n3 =
SIZE(in_field, 3)
133 out_field(l_t_g(1:mesh_in%dom_np),i2,i3) = in_field(1:mesh_in%dom_np,i2,i3)
140 out_field(1:m1,i2,i3) = in_field(l_t_g(1:m1),i2,i3)
147 SUBROUTINE loc_to_glob(mesh_loc, mesh_glob, l_t_g)
152 INTEGER,
DIMENSION(mesh_loc%np) :: l_t_g
154 REAL(KIND=8) :: epsilon = 1.d-10
156 REAL(KIND=8),
DIMENSION(2) :: r_loc, r_glob
159 r_loc = mesh_loc%rr(:,i)
161 r_glob = mesh_glob%rr(:,j)
162 IF (sum((r_loc-r_glob)**2) < epsilon)
THEN 169 IF (minval(l_t_g)==0)
WRITE(*,*)
'BUG in loc_to_glob', mesh_loc%rr(:,minloc(l_t_g))
172 END SUBROUTINE loc_to_glob
175 SUBROUTINE interp_mesh(mesh_in, mesh_out, in_field, out_field, controle, type_fe)
180 REAL(KIND=8),
DIMENSION(:,:,:) :: in_field, out_field
181 INTEGER,
DIMENSION(mesh_out%np) :: controle
184 INTEGER :: m, i, j, k, ni, l
185 REAL(KIND=8),
DIMENSION(mesh_in%gauss%n_w) :: ff
186 REAL(KIND=8),
DIMENSION(mesh_in%gauss%n_ws) :: ffe
187 REAL(KIND=8),
DIMENSION(3) :: abc
188 REAL(KIND=8),
DIMENSION(2) :: ab
193 DO i = 1, mesh_out%np
194 CALL find_elem(mesh_in, mesh_out%rr(:,i), abc, m)
199 DO j = 1,
SIZE(in_field,2)
200 DO k = 1,
SIZE(in_field,3)
201 out_field(i,j,k) = sum(ff*in_field(mesh_in%jj(:,m),j,k))
207 DO j = 1, mesh_out%mes
208 DO ni = 1,
SIZE(mesh_out%jjs,1)
209 i = mesh_out%jjs(ni,j)
210 IF (controle(i)>0) cycle
211 CALL find_edge(mesh_in, mesh_out%rr(:,i), m, ab)
215 DO l = 1,
SIZE(in_field, 2)
216 DO k = 1,
SIZE(in_field, 3)
217 out_field(i,l,k) = sum(ffe*in_field(mesh_in%jjs(:,m),l,k))
223 IF (maxval(controle) > 1)
WRITE(*,*)
'BUG in interp_mesh' 227 SUBROUTINE gauss_ff(abc, type_fe, ff)
229 REAL(KIND=8),
DIMENSION(3) :: abc
230 INTEGER,
INTENT(IN) :: type_fe
231 REAL(KIND=8),
DIMENSION(3*type_fe):: ff
233 IF (abs(1.d0-sum(abc)) > 1.d-12)
THEN 234 WRITE(*,*)
'bug in gauss_ff' 238 IF (type_fe == 1)
THEN 241 ff(1:3) = abc*(2*abc - 1)
242 ff(4) = 4*abc(2)*abc(3)
243 ff(5) = 4*abc(3)*abc(1)
244 ff(6) = 4*abc(1)*abc(2)
252 REAL(KIND=8),
DIMENSION(2) :: rr
253 REAL(KIND=8),
DIMENSION(3) :: abc
255 REAL(KIND=8),
DIMENSION(2) :: X1, X2, X3, Y12, Y23, Y31, R1, R2, R3
260 x1 = mesh%rr(:,mesh%jj(1,n)) - rr
261 x2 = mesh%rr(:,mesh%jj(2,n)) - rr
262 x3 = mesh%rr(:,mesh%jj(3,n)) - rr
263 y23 = mesh%rr(:,mesh%jj(3,n))-mesh%rr(:,mesh%jj(2,n))
264 y31 = mesh%rr(:,mesh%jj(1,n))-mesh%rr(:,mesh%jj(3,n))
265 y12 = mesh%rr(:,mesh%jj(2,n))-mesh%rr(:,mesh%jj(1,n))
273 IF (minval(abc) < -1.d-12) cycle
285 REAL(KIND=8),
DIMENSION(2) :: ab
286 INTEGER,
INTENT(IN) :: type_fe
287 REAL(KIND=8),
DIMENSION(1+type_fe):: ff
289 IF (abs(1.d0-sum(ab)) > 1.d-12)
THEN 290 WRITE(*,*)
'bug in gauss_ff_edge' 294 IF (type_fe == 1)
THEN 297 ff(1) = ab(1)*(ab(1)-ab(2))
298 ff(2) = ab(2)*(ab(2)-ab(1))
299 ff(3) = 4*ab(1)*ab(2)
309 REAL(KIND=8),
DIMENSION(2) :: rr, ab, abt
311 REAL(KIND=8) :: x, y, h, hr
317 h = sum((mesh%rr(:,mesh%jjs(1,ms))-mesh%rr(:,mesh%jjs(2,ms)))**2)
319 CALL dist(rr, mesh%rr(:,mesh%jjs(1,ms)), mesh%rr(:,mesh%jjs(2,ms)), y, abt)
335 SUBROUTINE dist(rr, rr1, rr2, y, abt)
338 REAL(KIND=8),
DIMENSION(2) :: rr, rr1, rr2, abt
340 REAL(KIND=8),
DIMENSION(2) :: Y12, X1, X2, R
351 IF (abt(1)*abt(2) < -1.d-12)
THEN 366 REAl(KIND=8),
DIMENSION(2) :: X, Y
372 FUNCTION pd_scal(X,Y) RESULT(pp)
374 REAL(KIND=8),
DIMENSION(:) :: X,Y
integer function eval_blank(len_str, string)