- Timestamp:
- 10/12/15 11:19:11 (9 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/check_conserve.f90
r326 r365 3 3 IMPLICIT NONE 4 4 5 PRIVATE 6 TYPE(t_field),POINTER,SAVE :: f_pk(:), f_pks(:), f_p(:) 7 TYPE(t_field),POINTER,SAVE :: f_vort(:) 8 TYPE(t_field),POINTER,SAVE :: f_rhodz(:) 9 10 INTEGER, PARAMETER :: check_basic=1, check_detailed=2 11 INTEGER, SAVE :: check_type 12 PUBLIC init_check_conserve, check_conserve, check_conserve_detailed 13 REAL(rstd),SAVE:: mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0 14 !$OMP THREADPRIVATE(check_type, mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0) 15 5 PRIVATE 6 7 INTEGER, PARAMETER, PUBLIC :: check_basic=1, check_detailed=2, & 8 AAM_dissip=1, AAM_dyn=2, AAM_phys=3 9 INTEGER, SAVE :: check_type 10 11 TYPE(t_field),POINTER,SAVE :: f_pk(:), f_pks(:), f_p(:) 12 TYPE(t_field),POINTER,SAVE :: f_vort(:) 13 TYPE(t_field),POINTER,SAVE :: f_rhodz(:) 14 15 REAL(rstd),SAVE :: AAM_mass, AAM_mass_old, AAM_vel, AAM_vel_old, & 16 AAM_mass_source(3), AAM_vel_source(3) ! read/written only IF is_master 17 REAL(rstd),SAVE :: mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0 18 !$OMP THREADPRIVATE(check_type, mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0) 19 20 PUBLIC :: init_check_conserve, check_conserve_detailed, check_conserve 16 21 CONTAINS 17 22 … … 19 24 20 25 SUBROUTINE init_check_conserve 21 USE icosa22 26 USE getin_mod 23 27 USE omp_para, ONLY : is_master 24 IMPLICIT NONE25 28 CHARACTER(LEN=255) :: check_type_str 26 29 CALL allocate_field(f_pk,field_t,type_real,llm) … … 47 50 48 51 SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it) 49 USE icosa50 52 USE pression_mod 51 53 USE vorticity_mod 52 54 USE caldyn_gcm_mod 53 55 USE exner_mod 54 USE mpipara, ONLY : is_mpi_master, comm_icosa 55 USE omp_para 56 IMPLICIT NONE 56 ! USE mpipara, ONLY : is_mpi_master, comm_icosa 57 USE omp_para, ONLY : is_master 57 58 TYPE(t_field),POINTER :: f_ps(:) 58 59 TYPE(t_field),POINTER :: f_dps(:) … … 63 64 64 65 REAL(rstd),POINTER :: p(:,:),rhodz(:,:) 65 INTEGER ::ind,ierr66 INTEGER :: ind,ierr 66 67 REAL(rstd) :: mtot, angtot, rmsdpdt 67 REAL(rstd) :: etot, stot, ang_mass, ang_v it, rmsvtot, ztot68 REAL(rstd) :: etot, stot, ang_mass, ang_vel, rmsvtot, ztot 68 69 69 70 CALL transfert_request(f_ue,req_e1_vect) … … 83 84 CALL check_PV(ztot) 84 85 CALL exner(f_ps,f_p,f_pks,f_pk) 85 CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vit, rmsvtot) 86 angtot = ang_mass + ang_vit 87 88 IF (is_master) THEN 86 CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, rmsvtot) 87 88 IF (is_master) THEN ! is_master = is_omp_master && is_mpi_master 89 ! AAM_mass and AAM_vel must be read/written only IF is_master 90 AAM_mass = ang_mass 91 AAM_vel = ang_vel 92 angtot = ang_mass + ang_vel 89 93 IF ( it == itau0 ) THEN 90 94 ztot0 = ztot … … 93 97 angtot0 = angtot 94 98 stot0 = stot 99 AAM_mass_old=AAM_mass 100 AAM_vel_old=AAM_vel 101 AAM_mass_source=0. 102 AAM_vel_source=0. 95 103 END IF 96 97 104 rmsvtot=SQRT(rmsvtot/mtot) 98 105 ztot=ztot/ztot0-1. ; mtot=mtot/mtot0-1. … … 107 114 108 115 4000 FORMAT(10x,'masse',5x,'rmsdpdt',5x,'energie',5x,'enstrophie' & 109 ,5x,'entropie',5x,'rmsv',5x,'mt.ang',/,'GLOB ' 116 ,5x,'entropie',5x,'rmsv',5x,'mt.ang',/,'GLOB ' & 110 117 ,e10.3,e13.6,5e13.3/) 111 close(134) 112 118 CLOSE(134) 119 120 IF(check_type == check_detailed) THEN 121 !ang_mass = AAM_mass-AAM_mass_old 122 !WRITE(*,'(A,3E12.4)') 'AAM_mass sanity check', SUM(AAM_mass_source), ang_mass, SUM(AAM_mass_source)-ang_mass 123 !ang_vel = AAM_vel-AAM_vel_old 124 !WRITE(*,'(A,3E12.4)') 'AAM_vel sanity check', SUM(AAM_vel_source), ang_vel, SUM(AAM_vel_source)-ang_vel 125 WRITE(*,'(A,6E12.4)') 'AAM_mass : time,old,new,dissip,dyn,phys', dt*it, AAM_mass_old, AAM_mass, & 126 AAM_mass_source(AAM_dissip), AAM_mass_source(AAM_dyn), AAM_mass_source(AAM_phys) 127 WRITE(*,'(A,6E12.4)') 'AAM_vel : time,old,new,dissip,dyn,phys', dt*it, AAM_vel_old, AAM_vel, & 128 AAM_vel_source(AAM_dissip), AAM_vel_source(AAM_dyn), AAM_vel_source(AAM_phys) 129 AAM_mass_old=AAM_mass 130 AAM_vel_old=AAM_vel 131 AAM_mass_source=0. 132 AAM_vel_source=0. 133 END IF 113 134 END IF 135 114 136 END SUBROUTINE check_conserve 115 137 116 138 !------------------------ Detailed check (Lauritzen et al., 2014) ----------------------------- 117 139 118 SUBROUTINE check_conserve_detailed(tag, f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it) 119 USE icosa 140 SUBROUTINE check_conserve_detailed(it,tag, f_ps,f_dps,f_ue,f_theta_rhodz,f_phis) 120 141 USE pression_mod 121 142 USE vorticity_mod 122 143 USE caldyn_gcm_mod 123 144 USE exner_mod 124 USE mpipara, ONLY : is_mpi_root, comm_icosa125 IMPLICIT NONE126 CHARACTER(LEN=*), INTENT(IN) :: tag145 ! USE mpipara, ONLY : is_mpi_root, comm_icosa 146 USE omp_para, ONLY : is_master 147 INTEGER, INTENT(IN) :: tag 127 148 TYPE(t_field),POINTER :: f_ps(:) 128 149 TYPE(t_field),POINTER :: f_dps(:) … … 134 155 REAL(rstd),POINTER :: p(:,:),rhodz(:,:) 135 156 INTEGER::ind,ierr 136 REAL(rstd) :: mtot, ztot, rmsdpdt, etot,stot,rmsv, AAM_mass, AAM_vel157 REAL(rstd) :: mtot, ztot, rmsdpdt, etot,stot,rmsv, ang_mass, ang_vel 137 158 138 159 IF(check_type == check_detailed) THEN 139 etot=0.0; stot=0.0; rmsv=0.0140 AAM_vel=0. ; AAM_vel=0.141 ztot = 0.0142 160 143 161 CALL transfert_request(f_ue,req_e1_vect) … … 152 170 END DO 153 171 CALL exner(f_ps,f_p,f_pks,f_pk) 154 CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, AAM_mass, AAM_vel, rmsv)172 CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, rmsv) 155 173 156 IF (is_mpi_root) THEN 157 !$OMP MASTER 158 IF ( it == itau0 ) Then 159 ztot0 = ztot 160 mtot0 = mtot 161 etot0 = etot 162 angtot0 = AAM_mass + AAM_vel 163 stot0 = stot 164 END IF 165 166 PRINT *, TRIM(tag), AAM_mass, AAM_vel 167 !$OMP END MASTER 174 IF (is_master) THEN 175 ! XXX=mass,vel 176 ! AAM_XXX = value of total AAM_XXX at last check 177 ! ang_XXX = value of total AAM_XXX now 178 ! AAM_XXX_source(tag) = source of AAA_XXX due to tag=dissip,dyn,phys 179 !WRITE(*,'(A,3E12.2)') 'AAM_mass', tag, ang_mass, AAM_mass, ang_mass-AAM_mass ! FIXME 180 !WRITE(*,'(A,3E12.2)') 'AAM_vel ', tag, ang_vel, AAM_vel, ang_vel-AAM_vel ! FIXME 181 AAM_mass_source(tag) = AAM_mass_source(tag) + ang_mass - AAM_mass 182 AAM_vel_source(tag) = AAM_vel_source(tag) + ang_vel - AAM_vel 183 AAM_mass = ang_mass 184 AAM_vel = ang_vel 168 185 END IF 169 186 END IF … … 176 193 USE mpipara 177 194 USE transfert_omp_mod 178 IMPLICIT NONE179 195 REAL(rstd), INTENT(IN) :: loc_sum 180 196 REAL(rstd), INTENT(OUT) :: glob_sum … … 188 204 ELSE 189 205 glob_sum=loc_sum 190 ENDIF 206 ENDIF 191 207 END SUBROUTINE global_sum 192 208 … … 195 211 USE mpipara 196 212 USE transfert_omp_mod 197 USE icosa198 213 USE omp_para 199 214 IMPLICIT NONE … … 233 248 SUBROUTINE check_energy(f_ue,f_theta_rhodz,f_phis, etot, & 234 249 stot, AAM_mass_tot, AAM_vel_tot, rmsvtot) 235 USE icosa236 250 USE pression_mod 237 251 USE vorticity_mod 238 IMPLICIT NONE239 252 TYPE(t_field), POINTER :: f_ue(:) 240 253 TYPE(t_field), POINTER :: f_theta_rhodz(:) … … 274 287 275 288 SUBROUTINE compute_energy(ind,u,p,rhodz,theta_rhodz,pk,phis, e, s, AAM_mass, AAM_vel, rmsv) 276 USE icosa277 289 USE disvert_mod 278 290 USE wind_mod 279 291 USE omp_para 280 IMPLICIT NONE281 292 INTEGER,INTENT(IN)::ind 282 293 REAL(rstd),INTENT(IN) :: u(3*iim*jjm,llm) … … 324 335 END DO 325 336 326 END SUBROUTINE compute_energy337 END SUBROUTINE compute_energy 327 338 328 339 !--------------------------------------------------------------------- 329 340 330 341 SUBROUTINE check_PV(ztot) 331 USE icosa 332 USE mpi_mod 333 USE mpipara 334 USE transfert_omp_mod 335 IMPLICIT NONE 336 REAL(rstd),INTENT(OUT) :: ztot 337 REAL(rstd), POINTER :: vort(:,:) 338 REAL(rstd), POINTER :: rhodz(:,:) 339 INTEGER :: ind 340 REAL(rstd) :: z,z_mpi 341 342 z=0 343 DO ind=1,ndomain 342 REAL(rstd),INTENT(OUT) :: ztot 343 REAL(rstd), POINTER :: vort(:,:) 344 REAL(rstd), POINTER :: rhodz(:,:) 345 INTEGER :: ind 346 REAL(rstd) :: z,z_mpi 347 348 z=0 349 DO ind=1,ndomain 344 350 IF (.NOT. assigned_domain(ind)) CYCLE 345 351 CALL swap_dimensions(ind) … … 348 354 rhodz=f_rhodz(ind) 349 355 CALL compute_PV(vort,rhodz,z) 350 ENDDO 351 352 IF (using_mpi) THEN 353 CALL reduce_sum_omp(z, z_mpi) 354 !$OMP MASTER 355 CALL MPI_REDUCE(z_mpi, ztot, 1, MPI_REAL8, MPI_SUM, 0, comm_icosa, ierr) 356 !$OMP END MASTER 357 ELSE 358 ztot=z 359 ENDIF 360 356 ENDDO 357 CALL global_sum(z, ztot) 361 358 END SUBROUTINE check_PV 362 359 363 360 SUBROUTINE compute_PV(vort,rhodz,z) 364 USE icosa365 361 USE disvert_mod 366 362 USE omp_para 367 IMPLICIT NONE368 363 REAL(rstd),INTENT(IN) :: vort(2*iim*jjm,llm) 369 364 REAL(rstd),INTENT(IN) :: rhodz(iim*jjm,llm) … … 402 397 403 398 SUBROUTINE compute_rhodz(p,rhodz) 404 USE icosa405 IMPLICIT NONE406 399 REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 407 400 REAL(rstd),INTENT(OUT):: rhodz(iim*jjm,llm) -
codes/icosagcm/trunk/src/timeloop_gcm.f90
r364 r365 225 225 226 226 IF (mod(it,itau_out)==0 ) THEN 227 CALL transfert_request(f_u,req_e1_vect) 227 228 CALL write_output_fields_basic(f_ps, f_u, f_q) 228 229 ENDIF 229 230 CALL check_conserve_detailed('detailed_budget 0', &231 f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)232 230 233 231 CALL guided(it*dt,f_ps,f_theta_rhodz,f_u,f_q) … … 239 237 CALL HEVI_scheme(it, fluxt_zero) 240 238 END SELECT 241 242 CALL check_conserve_detailed('detailed_budget 1', &243 f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)244 239 245 240 IF (MOD(it,itau_dissip)==0) THEN … … 257 252 ENDIF 258 253 254 CALL check_conserve_detailed(it, AAM_dyn, & 255 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 256 259 257 CALL dissip(f_u,f_du,f_mass,f_phis, f_theta_rhodz,f_dtheta_rhodz) 260 258 … … 264 262 CALL euler_scheme(.FALSE.) ! update only u, theta 265 263 END IF 266 END IF 267 268 CALL check_conserve_detailed('detailed_budget 2', &269 f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)264 265 CALL check_conserve_detailed(it, AAM_dissip, & 266 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 267 END IF 270 268 271 269 IF(MOD(it,itau_adv)==0) THEN … … 284 282 END IF 285 283 286 IF (MOD(it,itau_check_conserv)==0) THEN287 CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)288 ENDIF289 290 284 IF (MOD(it,itau_physics)==0) THEN 285 CALL check_conserve_detailed(it, AAM_dyn, & 286 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 291 287 CALL physics(it,f_phis, f_ps, f_theta_rhodz, f_u, f_wflux, f_q) 288 CALL check_conserve_detailed(it, AAM_phys, & 289 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 292 290 !$OMP MASTER 293 291 IF (first_physic) CALL SYSTEM_CLOCK(start_clock) … … 295 293 first_physic=.FALSE. 296 294 END IF 297 295 296 IF (MOD(it,itau_check_conserv)==0) THEN 297 CALL check_conserve_detailed(it, AAM_dyn, & 298 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 299 CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 300 ENDIF 298 301 END DO 299 302 300 303 CALL write_etat0(itau0+itaumax,f_ps, f_phis,f_theta_rhodz,f_u,f_q) 301 304 305 CALL check_conserve_detailed(it, AAM_dyn, & 306 f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 302 307 CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 303 308 … … 316 321 INTEGER :: it, itau0, itaumax, start_clock, stop_clock, rate_clock, throughput 317 322 REAL :: per_step,total, elapsed 318 WRITE(*,'(A,I7,A,F 8.1)') "It No :",it," t :",dt*it323 WRITE(*,'(A,I7,A,F14.1)') "It No :",it," t :",dt*it 319 324 IF(MOD(it,10)==0) THEN 320 325 CALL SYSTEM_CLOCK(stop_clock)
Note: See TracChangeset
for help on using the changeset viewer.