00001 subroutine iteration_HS(iter_count)
00002 use phys_constant, only : long, nnrg, nntg, nnpg
00003 use def_formulation, only : chgra, chope
00004 use def_metric_hij, only : hxxd, hxyd, hxzd, hyyd, hyzd, hzzd
00005 use grid_parameter
00006 use coordinate_grav_r
00007 use coordinate_grav_phi
00008 use coordinate_grav_theta
00009 use weight_midpoint_grav
00010 use make_array_2d
00011 use make_array_3d
00012 use make_array_4d
00013 use def_metric
00014 use def_matter
00015 use interface_interpo_fl2gr
00016 use interface_poisson_solver
00017 use interface_helmholtz_solver
00018 use interface_helmholtz_solver_outgoing
00019
00020
00021
00022 use interface_compute_shift
00023 use interface_compute_alps2alph
00024 use interface_hydrostatic_eq_WL_peos
00025 use interface_calc_surface
00026 use interface_update_grfield
00027 use interface_update_matter
00028 use interface_update_parameter_WL_peos
00029 use interface_update_surface
00030 use interface_error_matter
00031 use interface_source_HaC_WL
00032 use interface_source_MoC_WL
00033 use interface_source_trfreeG_WL
00034 use interface_source_trG_WL
00035 use interface_compute_fnc_multiple
00036 use interface_error_metric_type0
00037 use interface_error_metric_type2
00038 implicit none
00039 real(long), pointer :: sou(:,:,:), pot(:,:,:), sou2(:,:,:)
00040 real(long), pointer :: potf(:,:,:), emd_bak(:,:,:), pot_bak(:,:,:)
00041 real(long), pointer :: potrs(:,:)
00042 real(long), pointer :: potx(:,:,:), poty(:,:,:), potz(:,:,:)
00043 real(long), pointer :: potx_bak(:,:,:), poty_bak(:,:,:), potz_bak(:,:,:)
00044 real(long), pointer :: souvec(:,:,:,:), souten(:,:,:,:)
00045 real(long), pointer :: pot1(:,:,:), pot2(:,:,:), pot3(:,:,:)
00046 real(long), pointer :: pot4(:,:,:), pot5(:,:,:), pot6(:,:,:)
00047 real(long), pointer :: bk1(:,:,:), bk2(:,:,:), bk3(:,:,:)
00048 real(long), pointer :: bk4(:,:,:), bk5(:,:,:), bk6(:,:,:)
00049 real(long), pointer :: work(:,:,:)
00050
00051 real(long) :: error_emd, count
00052 integer :: iter_count, flag = 0, hydro_iter = 4
00053 integer :: irf, itf, ipf, irg, itg, ipg, ihy
00054
00055 real(long) :: error_all(20)
00056 integer :: flag_all(20) = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
00057
00058 call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00059 call alloc_array3d(pot,0,nrg,0,ntg,0,npg)
00060 call alloc_array3d(sou2,0,nrg,0,ntg,0,npg)
00061 call alloc_array3d(potf,0,nrf,0,ntf,0,npf)
00062 call alloc_array3d(emd_bak,0,nrf,0,ntf,0,npf)
00063 call alloc_array2d(potrs,0,ntf,0,npf)
00064 call alloc_array3d(potx,0,nrg,0,ntg,0,npg)
00065 call alloc_array3d(poty,0,nrg,0,ntg,0,npg)
00066 call alloc_array3d(potz,0,nrg,0,ntg,0,npg)
00067 call alloc_array4d(souvec,0,nrg,0,ntg,0,npg,1,3)
00068 call alloc_array4d(souten,0,nrg,0,ntg,0,npg,1,6)
00069 call alloc_array3d(pot1,0,nrg,0,ntg,0,npg)
00070 call alloc_array3d(pot2,0,nrg,0,ntg,0,npg)
00071 call alloc_array3d(pot3,0,nrg,0,ntg,0,npg)
00072 call alloc_array3d(pot4,0,nrg,0,ntg,0,npg)
00073 call alloc_array3d(pot5,0,nrg,0,ntg,0,npg)
00074 call alloc_array3d(pot6,0,nrg,0,ntg,0,npg)
00075 call alloc_array3d(pot_bak,0,nrg,0,ntg,0,npg)
00076 call alloc_array3d(potx_bak,0,nrg,0,ntg,0,npg)
00077 call alloc_array3d(poty_bak,0,nrg,0,ntg,0,npg)
00078 call alloc_array3d(potz_bak,0,nrg,0,ntg,0,npg)
00079 call alloc_array3d(bk1,0,nrg,0,ntg,0,npg)
00080 call alloc_array3d(bk2,0,nrg,0,ntg,0,npg)
00081 call alloc_array3d(bk3,0,nrg,0,ntg,0,npg)
00082 call alloc_array3d(bk4,0,nrg,0,ntg,0,npg)
00083 call alloc_array3d(bk5,0,nrg,0,ntg,0,npg)
00084 call alloc_array3d(bk6,0,nrg,0,ntg,0,npg)
00085 call alloc_array3d(work,0,nrg,0,ntg,0,npg)
00086
00087 iter_count = 0
00088 do
00089 iter_count = iter_count + 1
00090 count = dble(iter_count)
00091 conv_gra = dmin1(conv0_gra,conv_ini*count)
00092 conv_den = dmin1(conv0_den,conv_ini*count)
00093
00094 emdg = 0.0d0
00095 call calc_vector_x_grav(1)
00096 call calc_vector_x_matter(1)
00097 call calc_vector_phi_grav(1)
00098 call calc_vector_phi_matter(1)
00099 call interpo_fl2gr(emd, emdg)
00100 call calc_shift_down2up
00101 call interpo_gr2fl_metric_WL
00102 call rotation_law_WL
00103 call calc_shift2rotshift
00104 call SEM_tensor
00105
00106
00107 if (chgra == 'i') call cleargeometry
00108 if (chgra /= 'i') then
00109 call cristoffel_midpoint
00110 call cristoffel_gridpoint
00111 call riccitensor_midpoint
00112 end if
00113 if (chgra == 'h'.or.chgra == 'c'.or.chgra == 'C' &
00114 &.or.chgra == 'H'.or.chgra == 'W') then
00115 call liegmab_midpoint
00116 call liegmab_gridpoint
00117 end if
00118
00119 call excurve_WL_midpoint
00120 call excurve_WL_gridpoint
00121 call ap2alps
00122
00123
00124 call source_HaC_WL(sou)
00125
00126 call poisson_solver(sou,pot)
00127 pot(0:nrg,0:ntg,0:npg) = pot(0:nrg,0:ntg,0:npg) + 1.0d0
00128 pot_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00129 call update_grfield(pot,psi,conv_gra)
00130 call update_parameter_WL_peos(conv_den)
00131 call error_metric_type0(psi,pot_bak,error_all(1),flag_all(1),'ns')
00132
00133
00134 call source_trG_WL(sou)
00135 call poisson_solver(sou,pot)
00136 pot(0:nrg,0:ntg,0:npg) = pot(0:nrg,0:ntg,0:npg) + 1.0d0
00137 pot_bak(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)
00138 call compute_alps2alph(pot,psi)
00139 call update_grfield(pot,alph,conv_gra)
00140 call update_parameter_WL_peos(conv_den)
00141 call error_metric_type0(alph,pot_bak,error_all(2),flag_all(2),'ns')
00142
00143 call printout_error_metric_combined_2(iter_count,error_all(1),error_all(2))
00144
00145 call source_MoC_WL(souvec)
00146 work(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 1)
00147 sou2(1:nrg, 1:ntg, 1:npg) = work(1:nrg, 1:ntg, 1:npg)
00148 call poisson_solver(sou2,potx)
00149 work(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 2)
00150 sou2(1:nrg, 1:ntg, 1:npg) = work(1:nrg, 1:ntg, 1:npg)
00151 call poisson_solver(sou2,poty)
00152 work(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 3)
00153 sou2(1:nrg, 1:ntg, 1:npg) = work(1:nrg, 1:ntg, 1:npg)
00154 call poisson_solver(sou2,potz)
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 potx_bak(0:nrg,0:ntg,0:npg) = bvxd(0:nrg,0:ntg,0:npg)
00165 poty_bak(0:nrg,0:ntg,0:npg) = bvyd(0:nrg,0:ntg,0:npg)
00166 potz_bak(0:nrg,0:ntg,0:npg) = bvzd(0:nrg,0:ntg,0:npg)
00167 call update_grfield(potx,bvxd,conv_gra)
00168 call update_grfield(poty,bvyd,conv_gra)
00169 call update_grfield(potz,bvzd,conv_gra)
00170 call update_parameter_WL_peos(conv_den)
00171 call error_metric_type2(bvxd,potx_bak,error_all(3),flag_all(3),'ns')
00172 call error_metric_type2(bvyd,poty_bak,error_all(4),flag_all(4),'ns')
00173 call error_metric_type2(bvzd,potz_bak,error_all(5),flag_all(5),'ns')
00174 call printout_error_metric_combined_3(iter_count,error_all(3), &
00175 & error_all(4),error_all(5))
00176
00177
00178
00179
00180
00181 call source_trfreeG_WL(souten)
00182
00183
00184 pot_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00185 bk1(0:nrg,0:ntg,0:npg) = hxxd(0:nrg,0:ntg,0:npg)
00186 bk2(0:nrg,0:ntg,0:npg) = hxyd(0:nrg,0:ntg,0:npg)
00187 bk3(0:nrg,0:ntg,0:npg) = hxzd(0:nrg,0:ntg,0:npg)
00188 bk4(0:nrg,0:ntg,0:npg) = hyyd(0:nrg,0:ntg,0:npg)
00189 bk5(0:nrg,0:ntg,0:npg) = hyzd(0:nrg,0:ntg,0:npg)
00190 bk6(0:nrg,0:ntg,0:npg) = hzzd(0:nrg,0:ntg,0:npg)
00191 hxxd(0:nrg,0:ntg,0:npg) = 0.0d0
00192 hxyd(0:nrg,0:ntg,0:npg) = 0.0d0
00193 hxzd(0:nrg,0:ntg,0:npg) = 0.0d0
00194 hyyd(0:nrg,0:ntg,0:npg) = 0.0d0
00195 hyzd(0:nrg,0:ntg,0:npg) = 0.0d0
00196 hzzd(0:nrg,0:ntg,0:npg) = 0.0d0
00197
00198
00199
00200 if (chope == 'L') then
00201
00202
00203 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,1)
00204
00205 call helmholtz_solver_outgoing(sou,pot1)
00206 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,2)
00207
00208 call helmholtz_solver_outgoing(sou,pot2)
00209 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,3)
00210
00211 call helmholtz_solver_outgoing(sou,pot3)
00212 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,4)
00213
00214 call helmholtz_solver_outgoing(sou,pot4)
00215 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,5)
00216
00217 call helmholtz_solver_outgoing(sou,pot5)
00218 sou(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,6)
00219
00220 call helmholtz_solver_outgoing(sou,pot6)
00221
00222 end if
00223
00224
00225
00226
00227
00228 hxxd(0:nrg,0:ntg,0:npg) = pot1(0:nrg,0:ntg,0:npg)
00229 hxyd(0:nrg,0:ntg,0:npg) = pot2(0:nrg,0:ntg,0:npg)
00230 hxzd(0:nrg,0:ntg,0:npg) = pot3(0:nrg,0:ntg,0:npg)
00231 hyyd(0:nrg,0:ntg,0:npg) = pot4(0:nrg,0:ntg,0:npg)
00232 hyzd(0:nrg,0:ntg,0:npg) = pot5(0:nrg,0:ntg,0:npg)
00233 hzzd(0:nrg,0:ntg,0:npg) = pot6(0:nrg,0:ntg,0:npg)
00234
00235
00236
00237
00238
00239
00240
00241 call invhij
00242 call gauge_hiju(conv_gra)
00243 call invhij_up2down
00244 call adjusthij
00245
00246
00247
00248 pot(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00249 pot1(0:nrg,0:ntg,0:npg) = hxxd(0:nrg,0:ntg,0:npg)
00250 pot2(0:nrg,0:ntg,0:npg) = hxyd(0:nrg,0:ntg,0:npg)
00251 pot3(0:nrg,0:ntg,0:npg) = hxzd(0:nrg,0:ntg,0:npg)
00252 pot4(0:nrg,0:ntg,0:npg) = hyyd(0:nrg,0:ntg,0:npg)
00253 pot5(0:nrg,0:ntg,0:npg) = hyzd(0:nrg,0:ntg,0:npg)
00254 pot6(0:nrg,0:ntg,0:npg) = hzzd(0:nrg,0:ntg,0:npg)
00255
00256 psi(0:nrg,0:ntg,0:npg) = pot_bak(0:nrg,0:ntg,0:npg)
00257 hxxd(0:nrg,0:ntg,0:npg) = bk1(0:nrg,0:ntg,0:npg)
00258 hxyd(0:nrg,0:ntg,0:npg) = bk2(0:nrg,0:ntg,0:npg)
00259 hxzd(0:nrg,0:ntg,0:npg) = bk3(0:nrg,0:ntg,0:npg)
00260 hyyd(0:nrg,0:ntg,0:npg) = bk4(0:nrg,0:ntg,0:npg)
00261 hyzd(0:nrg,0:ntg,0:npg) = bk5(0:nrg,0:ntg,0:npg)
00262 hzzd(0:nrg,0:ntg,0:npg) = bk6(0:nrg,0:ntg,0:npg)
00263
00264 call update_grfield(pot_bak,psi,conv_gra)
00265 call update_grfield(pot1,hxxd,conv_gra)
00266 call update_grfield(pot2,hxyd,conv_gra)
00267 call update_grfield(pot3,hxzd,conv_gra)
00268 call update_grfield(pot4,hyyd,conv_gra)
00269 call update_grfield(pot5,hyzd,conv_gra)
00270 call update_grfield(pot6,hzzd,conv_gra)
00271
00272
00273
00274
00275
00276
00277
00278 call invhij
00279 call compute_fnc_multiple(alph,psi,alps)
00280
00281 call update_parameter_WL_peos(conv_den)
00282 call error_metric_type2(hxxd,bk1,error_all(6),flag_all(6),'ns')
00283 call error_metric_type2(hxyd,bk2,error_all(7),flag_all(7),'ns')
00284 call error_metric_type2(hxzd,bk3,error_all(8),flag_all(8),'ns')
00285 call error_metric_type2(hyyd,bk4,error_all(9),flag_all(9),'ns')
00286 call error_metric_type2(hyzd,bk5,error_all(10),flag_all(10),'ns')
00287 call error_metric_type2(hzzd,bk6,error_all(11),flag_all(11),'ns')
00288 call printout_error_metric_combined_3(iter_count,error_all(6), &
00289 & error_all(7),error_all(8))
00290 call printout_error_metric_combined_3(iter_count,error_all(9), &
00291 & error_all(10),error_all(11))
00292
00293
00294
00295 itg = ntg/2-2; ipg = npg/2-2
00296 open(16,file='test_vec2',status='unknown')
00297 do irg = 0, nrg
00298 write(16,'(1p,12e20.12)') rg(irg), psi(irg,itg,ipg) &
00299 & , alph(irg,itg,ipg) &
00300 & , bvxd(irg,itg,ipg) &
00301 & , bvyd(irg,itg,ipg) &
00302 & , bvzd(irg,itg,ipg) &
00303 & , hxxd(irg,itg,ipg) &
00304 & , hxyd(irg,itg,ipg) &
00305 & , hxzd(irg,itg,ipg) &
00306 & , hyyd(irg,itg,ipg) &
00307 & , hyzd(irg,itg,ipg) &
00308 & , hzzd(irg,itg,ipg)
00309 end do
00310 close(16)
00311
00312
00313
00314
00315 do ihy = 1, hydro_iter
00316 if (ihy.eq.1) emd_bak = emd
00317 call interpo_gr2fl_metric_WL
00318 call rotation_law_WL
00319 call hydrostatic_eq_WL_peos(potf)
00320 call calc_surface(potrs, potf)
00321 call update_matter(potf,emd,conv_den)
00322 call update_surface(potrs,rs,conv_den)
00323 call reset_fluid
00324 call update_parameter_WL_peos(conv_den)
00325 call calc_vector_x_matter(1)
00326 call calc_vector_phi_matter(1)
00327
00328 if (ihy.eq.hydro_iter) then
00329 call error_matter(emd,emd_bak,error_all(12),flag_all(12))
00330 call printout_error(iter_count,error_all(12))
00331 end if
00332 end do
00333
00334
00335
00336
00337
00338
00339
00340
00341 if (flag_all(12)==0) exit
00342 if (iter_count >= iter_max) exit
00343 flag = 0
00344 flag_all(1:20) = 0
00345
00346 end do
00347
00348 deallocate(sou)
00349 deallocate(pot)
00350 deallocate(sou2)
00351 deallocate(potf)
00352 deallocate(emd_bak)
00353 deallocate(potrs)
00354 deallocate(potx)
00355 deallocate(poty)
00356 deallocate(potz)
00357 deallocate(souvec)
00358 deallocate(souten)
00359 deallocate(pot1)
00360 deallocate(pot2)
00361 deallocate(pot3)
00362 deallocate(pot4)
00363 deallocate(pot5)
00364 deallocate(pot6)
00365 deallocate(pot_bak)
00366 deallocate(potx_bak)
00367 deallocate(poty_bak)
00368 deallocate(potz_bak)
00369 deallocate(bk1)
00370 deallocate(bk2)
00371 deallocate(bk3)
00372 deallocate(bk4)
00373 deallocate(bk5)
00374 deallocate(bk6)
00375 deallocate(work)
00376 end subroutine iteration_HS