Changeset 5117 for LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Timestamp:
- Jul 24, 2024, 4:23:34 PM (2 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Files:
-
- 69 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/abort_gcm.f90
r5116 r5117 18 18 ! ierr = severity of situation ( = 0 normal ) 19 19 20 CHARACTER(LEN=*), intent(in):: modname20 CHARACTER(LEN=*), INTENT(IN):: modname 21 21 INTEGER :: ierr, ierror_mpi 22 CHARACTER(LEN=*), intent(in):: message22 CHARACTER(LEN=*), INTENT(IN):: message 23 23 24 24 WRITE(lunout,*) 'in abort_gcm' … … 26 26 CALL histclo 27 27 CALL restclo 28 if(MPI_rank == 0) THEN28 IF (MPI_rank == 0) THEN 29 29 CALL getin_dump 30 endif30 ENDIF 31 31 !$OMP END MASTER 32 32 ! CALL histclo(2) … … 36 36 WRITE(lunout,*) 'Stopping in ', modname 37 37 WRITE(lunout,*) 'Reason = ',message 38 if(ierr == 0) THEN38 IF (ierr == 0) THEN 39 39 WRITE(lunout,*) 'Everything is cool' 40 40 else 41 41 WRITE(lunout,*) 'Houston, we have a problem, ierr = ', ierr 42 42 43 if(using_mpi) THEN43 IF (using_mpi) THEN 44 44 !$OMP CRITICAL (MPI_ABORT_GCM) 45 45 CALL MPI_ABORT(COMM_LMDZ, 1, ierror_mpi) … … 49 49 endif 50 50 51 endif51 ENDIF 52 52 END SUBROUTINE abort_gcm -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/addfi_loc.f90
r5116 r5117 96 96 !$OMP END DO NOWAIT 97 97 98 if(pole_nord) THEN98 IF (pole_nord) THEN 99 99 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 100 100 DO k = 1, llm … … 109 109 ENDDO 110 110 !$OMP END DO NOWAIT 111 endif112 113 if(pole_sud) THEN111 ENDIF 112 113 IF (pole_sud) THEN 114 114 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 115 115 DO k = 1, llm … … 124 124 ENDDO 125 125 !$OMP END DO NOWAIT 126 endif126 ENDIF 127 127 ! 128 128 129 129 ijb=ij_begin 130 130 ije=ij_end 131 if(pole_nord) ijb=ij_begin+iip1132 if(pole_sud) ije=ij_end-iip1131 IF (pole_nord) ijb=ij_begin+iip1 132 IF (pole_sud) ije=ij_end-iip1 133 133 134 134 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 140 140 !$OMP END DO NOWAIT 141 141 142 if(pole_nord) ijb=ij_begin142 IF (pole_nord) ijb=ij_begin 143 143 144 144 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 151 151 152 152 ! 153 if(pole_sud) ije=ij_end153 IF (pole_sud) ije=ij_end 154 154 !$OMP MASTER 155 155 DO j = ijb,ije … … 158 158 !$OMP END MASTER 159 159 160 if(planet_type=="earth") THEN160 IF (planet_type=="earth") THEN 161 161 ! earth case, special treatment for first 2 tracers (water) 162 162 DO iq = 1, 2 … … 193 193 !$OMP END DO NOWAIT 194 194 ENDDO 195 endif! of if (planet_type=="earth")195 ENDIF ! of if (planet_type=="earth") 196 196 197 197 !$OMP MASTER 198 if(pole_nord) THEN198 IF (pole_nord) THEN 199 199 DO ij = 1, iim 200 200 xpn(ij) = aire( ij ) * pps( ij ) … … 207 207 ENDDO 208 208 209 endif210 211 if(pole_sud) THEN209 ENDIF 210 211 IF (pole_sud) THEN 212 212 DO ij = 1, iim 213 213 xps(ij) = aire(ij+ip1jm) * pps(ij+ip1jm ) … … 220 220 ENDDO 221 221 222 endif222 ENDIF 223 223 !$OMP END MASTER 224 224 225 if(pole_nord) THEN225 IF (pole_nord) THEN 226 226 DO iq = 1, nqtot 227 227 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 238 238 !$OMP END DO NOWAIT 239 239 ENDDO 240 endif241 242 if(pole_sud) THEN240 ENDIF 241 242 IF (pole_sud) THEN 243 243 DO iq = 1, nqtot 244 244 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 255 255 !$OMP END DO NOWAIT 256 256 ENDDO 257 endif257 ENDIF 258 258 259 259 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advect_new_loc.f90
r5116 r5117 75 75 ijb = ij_begin 76 76 ije = ij_end 77 if(pole_nord) ijb = ijb + iip178 if(pole_sud) ije = ije - iip177 IF (pole_nord) ijb = ijb + iip1 78 IF (pole_sud) ije = ije - iip1 79 79 80 80 DO ij = ijb, ije … … 85 85 ijb = ij_begin 86 86 ije = ij_end 87 if(pole_sud) ije = ij_end - iip187 IF (pole_sud) ije = ij_end - iip1 88 88 89 89 DO ij = ijb, ije … … 107 107 ijb = ij_begin 108 108 ije = ij_end 109 if(pole_nord) ijb = ijb + iip1110 if(pole_sud) ije = ije - iip1109 IF (pole_nord) ijb = ijb + iip1 110 IF (pole_sud) ije = ije - iip1 111 111 112 112 ! DO ij = iip2, ip1jmp1 … … 124 124 ENDDO 125 125 126 if(pole_nord) THEN126 IF (pole_nord) THEN 127 127 DO ij = 1, iip1 128 128 uav(ij, l) = 0. … … 130 130 endif 131 131 132 if(pole_sud) THEN132 IF (pole_sud) THEN 133 133 DO ij = 1, iip1 134 134 uav(ip1jm + ij, l) = 0. … … 145 145 ijb = ij_begin 146 146 ije = ij_end 147 if(pole_sud) ije = ij_end - iip1147 IF (pole_sud) ije = ij_end - iip1 148 148 149 149 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 180 180 ijb = ij_begin 181 181 ije = ij_end + iip1 182 if(pole_sud) ije = ij_end182 IF (pole_sud) ije = ij_end 183 183 184 184 DO ij = ijb, ije … … 191 191 ijb = ij_begin 192 192 ije = ij_end 193 if(pole_nord) ijb = ijb + iip1194 if(pole_sud) ije = ije - iip1193 IF (pole_nord) ijb = ijb + iip1 194 IF (pole_sud) ije = ije - iip1 195 195 196 196 DO ij = ijb, ije - 1 … … 204 204 ijb = ij_begin 205 205 ije = ij_end 206 if(pole_sud) ije = ij_end - iip1206 IF (pole_sud) ije = ij_end - iip1 207 207 208 208 DO ij = ijb, ije … … 247 247 ijb = ij_begin 248 248 ije = ij_end 249 if(pole_nord) ijb = ijb + iip1250 if(pole_sud) ije = ije - iip1249 IF (pole_nord) ijb = ijb + iip1 250 IF (pole_sud) ije = ije - iip1 251 251 IF (CPPKEY_DEBUGIO) THEN 252 252 CALL WriteField_u('du_bis', du) … … 270 270 ijb = ij_begin 271 271 ije = ij_end 272 if(pole_sud) ije = ij_end - iip1272 IF (pole_sud) ije = ij_end - iip1 273 273 274 274 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advtrac_loc.f90
r5116 r5117 14 14 USE Bands 15 15 USE mod_hallo 16 USE Vampir16 USE lmdz_vampir 17 17 USE times 18 18 USE advtrac_mod, ONLY: finmasse 19 19 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO 20 USE strings_mod, ONLY: int2str20 USE lmdz_strings, ONLY: int2str 21 21 USE lmdz_description, ONLY: descript 22 22 USE lmdz_libmath, ONLY: minmax -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bands.F90
r5116 r5117 4 4 module Bands 5 5 USE parallel_lmdz 6 integer, parameter :: bands_caldyn=17 integer, parameter :: bands_vanleer=28 integer, parameter :: bands_dissip=36 INTEGER, parameter :: bands_caldyn=1 7 INTEGER, parameter :: bands_vanleer=2 8 INTEGER, parameter :: bands_dissip=3 9 9 10 INTEGER, dimension(:),allocatable:: jj_Nb_Caldyn11 INTEGER, dimension(:),allocatable:: jj_Nb_vanleer12 INTEGER, dimension(:),allocatable:: jj_Nb_vanleer213 INTEGER, dimension(:),allocatable:: jj_Nb_dissip14 INTEGER, dimension(:),allocatable:: jj_Nb_physic15 INTEGER, dimension(:),allocatable:: jj_Nb_physic_bis10 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_Caldyn 11 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_vanleer 12 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_vanleer2 13 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_dissip 14 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_physic 15 INTEGER,DIMENSION(:),ALLOCATABLE :: jj_Nb_physic_bis 16 16 17 17 TYPE(distrib),SAVE,TARGET :: distrib_Caldyn … … 22 22 TYPE(distrib),SAVE,TARGET :: distrib_physic_bis 23 23 24 INTEGER, dimension(:),allocatable:: distrib_phys24 INTEGER,DIMENSION(:),ALLOCATABLE :: distrib_phys 25 25 26 26 contains … … 46 46 include "dimensions.h" 47 47 INTEGER :: i,j 48 character (len=4) :: siim,sjjm,sllm,sproc49 character (len=255) :: filename48 CHARACTER (LEN=4) :: siim,sjjm,sllm,sproc 49 CHARACTER (LEN=255) :: filename 50 50 INTEGER :: unit_number=10 51 51 INTEGER :: ierr … … 61 61 OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='old',FORM='formatted',IOSTAT=ierr) 62 62 63 if(ierr==0) THEN63 IF (ierr==0) THEN 64 64 do i=0,mpi_size-1 65 65 read (unit_number,*) j,jj_nb_caldyn(i) … … 83 83 do i=0,mpi_size-1 84 84 jj_nb_caldyn(i)=(jjm+1)/mpi_size 85 if(i<MOD(jjm+1,mpi_size)) jj_nb_caldyn(i)=jj_nb_caldyn(i)+185 IF (i<MOD(jjm+1,mpi_size)) jj_nb_caldyn(i)=jj_nb_caldyn(i)+1 86 86 enddo 87 87 … … 112 112 do i=0,mpi_size-1 113 113 jj_nb_vanleer2(i)=(jjm+1)/mpi_size 114 if(i<MOD(jjm+1,mpi_size)) jj_nb_vanleer2(i)=jj_nb_vanleer2(i)+1114 IF (i<MOD(jjm+1,mpi_size)) jj_nb_vanleer2(i)=jj_nb_vanleer2(i)+1 115 115 enddo 116 116 … … 128 128 do i=0,MPI_Size-1 129 129 jj_Nb_physic(i)=jj_para_end(i)-jj_para_begin(i)+1 130 if(i/=0) THEN131 if(jj_para_begin(i)==jj_para_end(i-1)) THEN130 IF (i/=0) THEN 131 IF (jj_para_begin(i)==jj_para_end(i-1)) THEN 132 132 jj_Nb_physic(i-1)=jj_Nb_physic(i-1)-1 133 133 endif … … 137 137 do i=0,MPI_Size-1 138 138 jj_Nb_physic_bis(i)=jj_para_end(i)-jj_para_begin(i)+1 139 if(i/=0) THEN140 if(jj_para_begin(i)==jj_para_end(i-1)) THEN139 IF (i/=0) THEN 140 IF (jj_para_begin(i)==jj_para_end(i-1)) THEN 141 141 jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1 142 142 else 143 143 jj_Nb_physic_bis(i-1)=jj_Nb_physic_bis(i-1)+1 144 144 jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1 145 endif145 ENDIF 146 146 endif 147 147 enddo … … 174 174 175 175 SUBROUTINE AdjustBands_caldyn(new_dist) 176 usetimes176 USE times 177 177 USE parallel_lmdz 178 178 IMPLICIT NONE … … 182 182 INTEGER :: min_proc,max_proc 183 183 INTEGER :: i,j 184 real,allocatable,dimension(:) :: value185 integer,allocatable,dimension(:) :: index184 REAL,ALLOCATABLE,DIMENSION(:) :: value 185 INTEGER,ALLOCATABLE,DIMENSION(:) :: index 186 186 REAL :: tmpvalue 187 187 INTEGER :: tmpindex … … 200 200 do i=0,mpi_size-2 201 201 do j=i+1,mpi_size-1 202 if(value(i)>value(j)) THEN202 IF (value(i)>value(j)) THEN 203 203 tmpvalue=value(i) 204 204 value(i)=value(j) … … 218 218 minvalue=value(i) 219 219 min_proc=index(i) 220 if(jj_nb_caldyn(max_proc)>2) THEN221 if(timer_iteration(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc)<=1 ) THEN220 IF (jj_nb_caldyn(max_proc)>2) THEN 221 IF (timer_iteration(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc)<=1 ) THEN 222 222 jj_nb_caldyn(min_proc)=jj_nb_caldyn(min_proc)+1 223 223 jj_nb_caldyn(max_proc)=jj_nb_caldyn(max_proc)-1 224 224 exit 225 225 else 226 if(timer_average(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc) &226 IF (timer_average(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc) & 227 227 -timer_delta(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc) < maxvalue) THEN 228 228 jj_nb_caldyn(min_proc)=jj_nb_caldyn(min_proc)+1 … … 241 241 242 242 SUBROUTINE AdjustBands_vanleer(new_dist) 243 usetimes243 USE times 244 244 USE parallel_lmdz 245 245 IMPLICIT NONE … … 249 249 INTEGER :: min_proc,max_proc 250 250 INTEGER :: i,j 251 real,allocatable,dimension(:) :: value252 integer,allocatable,dimension(:) :: index251 REAL,ALLOCATABLE,DIMENSION(:) :: value 252 INTEGER,ALLOCATABLE,DIMENSION(:) :: index 253 253 REAL :: tmpvalue 254 254 INTEGER :: tmpindex … … 267 267 do i=0,mpi_size-2 268 268 do j=i+1,mpi_size-1 269 if(value(i)>value(j)) THEN269 IF (value(i)>value(j)) THEN 270 270 tmpvalue=value(i) 271 271 value(i)=value(j) … … 286 286 min_proc=index(i) 287 287 288 if(jj_nb_vanleer(max_proc)>2) THEN289 if (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc)==0. .or. &288 IF (jj_nb_vanleer(max_proc)>2) THEN 289 IF (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc)==0. .OR. & 290 290 timer_average(jj_nb_vanleer(max_proc)-1,timer_vanleer,max_proc)==0.) THEN 291 291 jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1 … … 293 293 exit 294 294 else 295 if(timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc) < maxvalue) THEN295 IF (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc) < maxvalue) THEN 296 296 jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1 297 297 jj_nb_vanleer(max_proc)=jj_nb_vanleer(max_proc)-1 … … 310 310 311 311 SUBROUTINE AdjustBands_dissip(new_dist) 312 usetimes312 USE times 313 313 USE parallel_lmdz 314 314 IMPLICIT NONE … … 318 318 INTEGER :: min_proc,max_proc 319 319 INTEGER :: i,j 320 real,allocatable,dimension(:) :: value321 integer,allocatable,dimension(:) :: index320 REAL,ALLOCATABLE,DIMENSION(:) :: value 321 INTEGER,ALLOCATABLE,DIMENSION(:) :: index 322 322 REAL :: tmpvalue 323 323 INTEGER :: tmpindex … … 336 336 do i=0,mpi_size-2 337 337 do j=i+1,mpi_size-1 338 if(value(i)>value(j)) THEN338 IF (value(i)>value(j)) THEN 339 339 tmpvalue=value(i) 340 340 value(i)=value(j) … … 355 355 min_proc=index(i) 356 356 357 if(jj_nb_dissip(max_proc)>3) THEN358 if(timer_iteration(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)<=1) THEN357 IF (jj_nb_dissip(max_proc)>3) THEN 358 IF (timer_iteration(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)<=1) THEN 359 359 jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1 360 360 jj_nb_dissip(max_proc)=jj_nb_dissip(max_proc)-1 361 361 exit 362 362 else 363 if(timer_average(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc) &363 IF (timer_average(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc) & 364 364 - timer_delta(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc) < maxvalue) THEN 365 365 jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1 … … 379 379 380 380 SUBROUTINE AdjustBands_physic 381 usetimes381 USE times 382 382 383 383 ! Ehouarn: what follows is only related to // physics … … 389 389 390 390 INTEGER :: i,Index 391 real,allocatable,dimension(:) :: value392 integer,allocatable,dimension(:) :: Inc391 REAL,ALLOCATABLE,DIMENSION(:) :: value 392 INTEGER,ALLOCATABLE,DIMENSION(:) :: Inc 393 393 REAL :: medium 394 394 INTEGER :: NbTot,sgn … … 414 414 enddo 415 415 416 if(NbTot>=0) THEN416 IF (NbTot>=0) THEN 417 417 Sgn=1 418 418 else … … 425 425 Inc(Index)=Inc(Index)-Sgn 426 426 Index=Index+1 427 if(Index>mpi_size-1) Index=0427 IF (Index>mpi_size-1) Index=0 428 428 enddo 429 429 … … 441 441 442 442 INTEGER :: i,j 443 character (len=4) :: siim,sjjm,sllm,sproc444 character (len=255) :: filename443 CHARACTER (LEN=4) :: siim,sjjm,sllm,sproc 444 CHARACTER (LEN=255) :: filename 445 445 INTEGER :: unit_number=10 446 446 INTEGER :: ierr … … 456 456 OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='replace',FORM='formatted',IOSTAT=ierr) 457 457 458 if(ierr==0) THEN458 IF (ierr==0) THEN 459 459 ! write (unit_number,*) '*** Bandes caldyn ***' 460 460 do i=0,mpi_size-1 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bernoui_loc.f90
r5106 r5117 45 45 ijb=ij_begin 46 46 ije=ij_end+iip1 47 if(pole_sud) ije=ij_end47 IF (pole_sud) ije=ij_end 48 48 49 49 jjb=jj_begin 50 50 jje=jj_end+1 51 if(pole_sud) jje=jj_end51 IF (pole_sud) jje=jj_end 52 52 53 53 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bilan_dyn_loc.f90
r5116 r5117 13 13 USE parallel_lmdz 14 14 USE mod_hallo 15 usemisc_mod15 USE misc_mod 16 16 USE write_field_loc 17 17 USE comconst_mod, ONLY: cpp, pi … … 56 56 ! ======= 57 57 58 integer,SAVE :: icum,ncum58 INTEGER,SAVE :: icum,ncum 59 59 !$OMP THREADPRIVATE(icum,ncum) 60 60 LOGICAL,SAVE :: first=.TRUE. … … 76 76 parameter (ifile=4) 77 77 78 integer,PARAMETER :: itemp=1,igeop=2,iecin=3,iang=4,iu=578 INTEGER,PARAMETER :: itemp=1,igeop=2,iecin=3,iang=4,iu=5 79 79 INTEGER,PARAMETER :: iovap=6,iun=7 80 integer,PARAMETER :: i_sortie=181 82 real,SAVE :: time=0.83 integer,SAVE :: itau=0.80 INTEGER,PARAMETER :: i_sortie=1 81 82 REAL,SAVE :: time=0. 83 INTEGER,SAVE :: itau=0. 84 84 !$OMP THREADPRIVATE(time,itau) 85 85 … … 95 95 96 96 ! champ contenant les scalaires advectés. 97 real,SAVE,ALLOCATABLE :: Q(:,:,:,:)97 REAL,SAVE,ALLOCATABLE :: Q(:,:,:,:) 98 98 99 99 ! champs cumulés 100 real,SAVE,ALLOCATABLE :: ps_cum(:,:)101 real,SAVE,ALLOCATABLE :: masse_cum(:,:,:)102 real,SAVE,ALLOCATABLE :: flux_u_cum(:,:,:)103 real,SAVE,ALLOCATABLE :: flux_v_cum(:,:,:)104 real,SAVE,ALLOCATABLE :: Q_cum(:,:,:,:)105 real,SAVE,ALLOCATABLE :: flux_uQ_cum(:,:,:,:)106 real,SAVE,ALLOCATABLE :: flux_vQ_cum(:,:,:,:)107 real,SAVE,ALLOCATABLE :: flux_wQ_cum(:,:,:,:)108 real,SAVE,ALLOCATABLE :: dQ(:,:,:,:)100 REAL,SAVE,ALLOCATABLE :: ps_cum(:,:) 101 REAL,SAVE,ALLOCATABLE :: masse_cum(:,:,:) 102 REAL,SAVE,ALLOCATABLE :: flux_u_cum(:,:,:) 103 REAL,SAVE,ALLOCATABLE :: flux_v_cum(:,:,:) 104 REAL,SAVE,ALLOCATABLE :: Q_cum(:,:,:,:) 105 REAL,SAVE,ALLOCATABLE :: flux_uQ_cum(:,:,:,:) 106 REAL,SAVE,ALLOCATABLE :: flux_vQ_cum(:,:,:,:) 107 REAL,SAVE,ALLOCATABLE :: flux_wQ_cum(:,:,:,:) 108 REAL,SAVE,ALLOCATABLE :: dQ(:,:,:,:) 109 109 110 110 … … 125 125 data ctrs/' ','TOT','MMC','TRS','STN'/ 126 126 127 real,SAVE,ALLOCATABLE :: zvQ(:,:,:,:),zvQtmp(:,:)128 real,SAVE,ALLOCATABLE :: zavQ(:,:,:),psiQ(:,:,:)129 real,SAVE,ALLOCATABLE :: zmasse(:,:),zamasse(:)130 131 real,SAVE,ALLOCATABLE :: zv(:,:),psi(:,:)127 REAL,SAVE,ALLOCATABLE :: zvQ(:,:,:,:),zvQtmp(:,:) 128 REAL,SAVE,ALLOCATABLE :: zavQ(:,:,:),psiQ(:,:,:) 129 REAL,SAVE,ALLOCATABLE :: zmasse(:,:),zamasse(:) 130 131 REAL,SAVE,ALLOCATABLE :: zv(:,:),psi(:,:) 132 132 133 133 INTEGER :: i,j,l,iQ … … 139 139 CHARACTER(LEN=10) :: infile 140 140 141 integer, save :: fileid141 INTEGER, save :: fileid 142 142 INTEGER :: thoriid, zvertiid 143 143 … … 153 153 INTEGER :: zan, dayref 154 154 ! 155 real,SAVE,ALLOCATABLE :: rlong(:),rlatg(:)155 REAL,SAVE,ALLOCATABLE :: rlong(:),rlatg(:) 156 156 INTEGER :: jjb,jje,jjn,ijb,ije 157 157 type(Request),SAVE :: Req … … 173 173 ! Initialisation 174 174 !===================================================================== 175 if(adjust) return175 IF (adjust) return 176 176 177 177 time=time+dt_app 178 178 itau=itau+1 179 179 180 if(first) THEN180 IF (first) THEN 181 181 !$OMP BARRIER 182 182 !$OMP MASTER … … 223 223 ! ncum est la frequence de stokage en pas de temps 224 224 ncum=dt_cum/dt_app 225 if(abs(ncum*dt_app-dt_cum)>1.e-5*dt_app) THEN225 IF (abs(ncum*dt_app-dt_cum)>1.e-5*dt_app) THEN 226 226 WRITE(lunout,*) & 227 227 'Pb : le pas de cumule doit etre multiple du pas' … … 358 358 359 359 !$OMP END MASTER 360 endif360 ENDIF 361 361 362 362 … … 419 419 Q_cum(:,jjb:jje,l,:)=0. 420 420 flux_uQ_cum(:,jjb:jje,l,:)=0. 421 if(pole_sud) jje=jj_end-1421 IF (pole_sud) jje=jj_end-1 422 422 flux_v_cum(:,jjb:jje,l)=0. 423 423 flux_vQ_cum(:,jjb:jje,l,:)=0. 424 424 ENDDO 425 425 !$OMP END DO NOWAIT 426 endif426 ENDIF 427 427 428 428 IF (prt_level > 5) & … … 447 447 !$OMP END DO NOWAIT 448 448 449 if(pole_sud) jje=jj_end-1449 IF (pole_sud) jje=jj_end-1 450 450 451 451 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 499 499 jjb=jj_begin 500 500 jje=jj_end 501 if(pole_sud) jje=jj_end-1501 IF (pole_sud) jje=jj_end-1 502 502 503 503 do iQ=1,nQ … … 582 582 ! PAS DE TEMPS D'ECRITURE 583 583 !===================================================================== 584 if(icum==ncum) THEN584 IF (icum==ncum) THEN 585 585 !===================================================================== 586 586 … … 647 647 jjb=jj_begin 648 648 jje=jj_end 649 if(pole_sud) jje=jj_end-1649 IF (pole_sud) jje=jj_end-1 650 650 651 651 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 670 670 jjb=jj_begin 671 671 jje=jj_end 672 if(pole_sud) jje=jj_end-1672 IF (pole_sud) jje=jj_end-1 673 673 674 674 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 717 717 jjb=jj_begin 718 718 jje=jj_end 719 if(pole_sud) jje=jj_end-1719 IF (pole_sud) jje=jj_end-1 720 720 721 721 zvQ=0. … … 776 776 ! sorties proprement dites 777 777 !$OMP MASTER 778 if(i_sortie==1) THEN778 IF (i_sortie==1) THEN 779 779 jjb=jj_begin 780 780 jje=jj_end 781 781 jjn=jj_nb 782 if(pole_sud) jje=jj_end-1783 if(pole_sud) jjn=jj_nb-1782 IF (pole_sud) jje=jj_end-1 783 IF (pole_sud) jjn=jj_nb-1 784 784 do iQ=1,nQ 785 785 do itr=1,ntr … … 801 801 jjn*llm,ndex3d) 802 802 803 endif803 ENDIF 804 804 805 805 … … 832 832 !///////////////////////////////////////////////////////////////////// 833 833 icum=0 !/////////////////////////////////////// 834 endif ! icum.eq.ncum !///////////////////////////////////////834 ENDIF ! icum.EQ.ncum !/////////////////////////////////////// 835 835 !///////////////////////////////////////////////////////////////////// 836 836 !===================================================================== -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caladvtrac_loc.f90
r5116 r5117 13 13 USE bands 14 14 USE times 15 USE Vampir15 USE lmdz_vampir 16 16 USE write_field_loc 17 17 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO … … 60 60 ijbv = ij_begin - iip1 61 61 ijev = ij_end 62 if(pole_nord) ijbv = ij_begin63 if(pole_sud) ijev = ij_end - iip162 IF (pole_nord) ijbv = ij_begin 63 IF (pole_sud) ijev = ij_end - iip1 64 64 65 65 IF(iadvtr==0) THEN -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caldyn_loc.f90
r5113 r5117 144 144 ije = ij_end + iip1 145 145 146 if(pole_nord) ijb = ij_begin147 if(pole_sud) ije = ij_end146 IF (pole_nord) ijb = ij_begin 147 IF (pole_sud) ije = ij_end 148 148 149 149 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 162 162 ijb = ij_begin 163 163 ije = ij_end 164 if(pole_sud) ije = ij_end - iip1164 IF (pole_sud) ije = ij_end - iip1 165 165 166 166 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/call_dissip_mod.f90
r5116 r5117 82 82 USE mod_hallo 83 83 USE Bands 84 USE vampir84 USE lmdz_vampir 85 85 USE write_field_loc 86 86 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO … … 240 240 !$OMP END DO NOWAIT 241 241 242 if(1 == 0) THEN242 IF (1 == 0) THEN 243 243 !!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics 244 244 !!! 2) should probably not be here anyway … … 274 274 !$OMP END DO NOWAIT 275 275 276 if(1 == 0) THEN276 IF (1 == 0) THEN 277 277 !!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics 278 278 !!! 2) should probably not be here anyway -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/check_isotopes_loc.F90
r5116 r5117 1 1 SUBROUTINE check_isotopes(q, ijb, ije, err_msg) 2 2 USE parallel_lmdz 3 USE strings_mod, ONLY: maxlen, msg, strIdx, strStack, int2str, real2str3 USE lmdz_strings, ONLY: maxlen, msg, strIdx, strStack, int2str, real2str 4 4 USE infotrac, ONLY: nqtot, niso, nphas, isotope, isoCheck, iqIsoPha, isoSelect, & 5 5 ntiso, iH2O, nzone, tracers, isoName, itZonIso, getKey … … 38 38 iso_O17 = strIdx(isoName,'H217O') 39 39 iso_HTO = strIdx(isoName,'HTO') 40 if(tnat1) THEN40 IF (tnat1) THEN 41 41 tnat(:)=1.0 42 42 else -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/conf_gcm.F90
r5116 r5117 91 91 lunout=6 92 92 CALL getin('lunout', lunout) 93 IF (lunout /= 5 . and. lunout /= 6) THEN93 IF (lunout /= 5 .AND. lunout /= 6) THEN 94 94 OPEN(UNIT=lunout,FILE='lmdz.out_0000',ACTION='write', & 95 95 STATUS='unknown',FORM='formatted') … … 102 102 ! adjust=y not implemented in case of OpenMP threads... 103 103 !$OMP PARALLEL 104 IF ((OMP_GET_NUM_THREADS()>1). and.adjust) THEN104 IF ((OMP_GET_NUM_THREADS()>1).AND.adjust) THEN 105 105 WRITE(lunout,*)'conf_gcm: Error, adjust should be set to n' & 106 106 ,' when running with OpenMP threads' … … 340 340 maxlatfilter = -1.0 341 341 CALL getin('maxlatfilter',maxlatfilter) 342 if(maxlatfilter > 90) &342 IF (maxlatfilter > 90) & 343 343 CALL abort_gcm("conf_gcm", 'maxlatfilter should be <=90', 1) 344 344 … … 359 359 iflag_top_bound=1 360 360 CALL getin('iflag_top_bound',iflag_top_bound) 361 IF (iflag_top_bound < 0 . or. iflag_top_bound > 2) &361 IF (iflag_top_bound < 0 .OR. iflag_top_bound > 2) & 362 362 CALL abort_gcm("conf_gcm", 'iflag_top_bound must be 0, 1 or 2', 1) 363 363 … … 396 396 CALL getin('ok_guide',ok_guide) 397 397 398 IF (ok_guide . and. adjust) CALL abort_gcm("conf_gcm", &398 IF (ok_guide .AND. adjust) CALL abort_gcm("conf_gcm", & 399 399 "adjust does not work with ok_guide", 1) 400 400 … … 436 436 ! ......... ( modif le 17/04/96 ) ......... 437 437 438 test_etatinit: IF (. not. etatinit) THEN438 test_etatinit: IF (.NOT. etatinit) THEN 439 439 !Config Key = clon 440 440 !Config Desc = centre du zoom, longitude … … 933 933 CALL getin('ok_strato',ok_strato) 934 934 935 vert_prof_dissip = merge(1, 0, ok_strato . and. llm==39)935 vert_prof_dissip = merge(1, 0, ok_strato .AND. llm==39) 936 936 CALL getin('vert_prof_dissip', vert_prof_dissip) 937 CALL assert(vert_prof_dissip == 0 . or. vert_prof_dissip == 1, &937 CALL assert(vert_prof_dissip == 0 .OR. vert_prof_dissip == 1, & 938 938 "bad value for vert_prof_dissip") 939 939 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/covcont_loc.f90
r5116 r5117 33 33 ijev=ij_end+iip1 34 34 35 if(pole_nord) THEN35 IF (pole_nord) THEN 36 36 ijbu=ij_begin+iip1 37 37 ijbv=ij_begin 38 endif38 ENDIF 39 39 40 if(pole_sud) THEN40 IF (pole_sud) THEN 41 41 ijeu=ij_end-iip1 42 42 ijev=ij_end-iip1 43 endif43 ENDIF 44 44 45 45 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/covnat_loc.f90
r5116 r5117 34 34 ije=ij_end 35 35 36 if(pole_nord) THEN36 IF (pole_nord) THEN 37 37 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 38 38 DO l = 1,klevel … … 42 42 ENDDO 43 43 !$OMP ENDDO NOWAIT 44 endif44 ENDIF 45 45 46 if(pole_sud) THEN46 IF (pole_sud) THEN 47 47 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 48 48 DO l = 1,klevel … … 52 52 ENDDO 53 53 !$OMP ENDDO NOWAIT 54 endif54 ENDIF 55 55 56 56 ijb=ij_begin 57 57 ije=ij_end 58 if(pole_nord) ijb=ij_begin+iip159 if(pole_sud) ije=ij_end-iip158 IF (pole_nord) ijb=ij_begin+iip1 59 IF (pole_sud) ije=ij_end-iip1 60 60 61 61 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 69 69 ijb=ij_begin-iip1 70 70 ije=ij_end 71 if(pole_nord) ijb=ij_begin72 if(pole_sud) ije=ij_end-iip171 IF (pole_nord) ijb=ij_begin 72 IF (pole_sud) ije=ij_end-iip1 73 73 74 74 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dissip_loc.f90
r5116 r5117 92 92 !$OMP END DO NOWAIT 93 93 94 if(pole_sud) ije = ij_end - iip194 IF (pole_sud) ije = ij_end - iip1 95 95 96 96 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 121 121 ijb = ij_begin 122 122 ije = ij_end 123 if(pole_sud) ije = ij_end - iip1124 125 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 126 DO l = 1, llm 127 if(pole_nord) THEN123 IF (pole_sud) ije = ij_end - iip1 124 125 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 126 DO l = 1, llm 127 IF (pole_nord) THEN 128 128 DO ij = 1, iip1 129 129 gdx(ij, l) = 0. … … 131 131 endif 132 132 133 if(pole_sud) THEN133 IF (pole_sud) THEN 134 134 DO ij = 1, iip1 135 135 gdx(ij + ip1jm, l) = 0. … … 137 137 endif 138 138 139 if(pole_nord) ijb = ij_begin + iip1139 IF (pole_nord) ijb = ij_begin + iip1 140 140 DO ij = ijb, ije 141 141 du(ij, l) = du(ij, l) - te1dt(l) * gdx(ij, l) 142 142 ENDDO 143 143 144 if(pole_nord) ijb = ij_begin144 IF (pole_nord) ijb = ij_begin 145 145 DO ij = ijb, ije 146 146 dv(ij, l) = dv(ij, l) - te1dt(l) * gdy(ij, l) … … 166 166 ijb = ij_begin 167 167 ije = ij_end 168 if(pole_sud) ije = ij_end - iip1169 170 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 171 DO l = 1, llm 172 173 if(pole_nord) THEN168 IF (pole_sud) ije = ij_end - iip1 169 170 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 171 DO l = 1, llm 172 173 IF (pole_nord) THEN 174 174 DO ij = 1, iip1 175 175 grx(ij, l) = 0. … … 177 177 endif 178 178 179 if(pole_nord) ijb = ij_begin + iip1179 IF (pole_nord) ijb = ij_begin + iip1 180 180 DO ij = ijb, ije 181 181 du(ij, l) = du(ij, l) - te2dt(l) * grx(ij, l) 182 182 ENDDO 183 183 184 if(pole_nord) ijb = ij_begin184 IF (pole_nord) ijb = ij_begin 185 185 DO ij = ijb, ije 186 186 dv(ij, l) = dv(ij, l) - te2dt(l) * gry(ij, l) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/diverg_gam_loc.f90
r5116 r5117 47 47 ijb=ij_begin 48 48 ije=ij_end 49 if(pole_nord) ijb=ij_begin+iip149 IF (pole_nord) ijb=ij_begin+iip1 50 50 IF(pole_sud) ije=ij_end-iip1 51 51 … … 70 70 ! .... calcul aux poles ..... 71 71 ! 72 if(pole_nord) THEN72 IF (pole_nord) THEN 73 73 DO ij = 1,iim 74 74 aiy1(ij) = cuvscvgam( ij ) * y( ij , l ) … … 81 81 endif 82 82 83 if(pole_sud) THEN83 IF (pole_sud) THEN 84 84 DO ij = 1,iim 85 85 aiy2(ij) = cuvscvgam( ij+ ip1jmi1 ) * y( ij+ ip1jmi1, l ) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/diverg_p.f90
r5116 r5117 43 43 ijb=ij_begin 44 44 ije=ij_end 45 if(pole_nord) ijb=ij_begin+iip145 IF (pole_nord) ijb=ij_begin+iip1 46 46 IF(pole_sud) ije=ij_end-iip1 47 47 … … 65 65 ! .... calcul aux poles ..... 66 66 ! 67 if(pole_nord) THEN67 IF (pole_nord) THEN 68 68 DO ij = 1,iim 69 69 aiy1(ij) = cuvsurcv( ij ) * y( ij , l ) … … 76 76 endif 77 77 78 if(pole_sud) THEN78 IF (pole_sud) THEN 79 79 DO ij = 1,iim 80 80 aiy2(ij) = cuvsurcv( ij+ ip1jmi1 ) * y( ij+ ip1jmi1, l ) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/divergf_loc.f90
r5116 r5117 45 45 ijb=ij_begin 46 46 ije=ij_end 47 if(pole_nord) ijb=ij_begin+iip147 IF (pole_nord) ijb=ij_begin+iip1 48 48 IF(pole_sud) ije=ij_end-iip1 49 49 … … 68 68 ! .... calcul aux poles ..... 69 69 ! 70 if(pole_nord) THEN70 IF (pole_nord) THEN 71 71 DO ij = 1,iim 72 72 aiy1(ij) = cuvsurcv( ij ) * y( ij , l ) … … 81 81 endif 82 82 83 if(pole_sud) THEN83 IF (pole_sud) THEN 84 84 DO ij = 1,iim 85 85 aiy2(ij) = cuvsurcv( ij+ ip1jmi1 ) * y( ij+ ip1jmi1, l ) … … 99 99 jjb=jj_begin 100 100 jje=jj_end 101 if(pole_sud) jje=jj_end-1101 IF (pole_sud) jje=jj_end-1 102 102 103 103 CALL filtreg_p( div,jjb_u,jje_u,jjb,jje, jjp1, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dteta1_loc.f90
r5116 r5117 44 44 ije=ij_end 45 45 46 if(pole_nord) ijb=ij_begin+iip147 if(pole_sud) ije=ij_end-iip146 IF (pole_nord) ijb=ij_begin+iip1 47 IF (pole_sud) ije=ij_end-iip1 48 48 49 49 DO ij = ijb, ije - 1 … … 60 60 61 61 ijb=ij_begin-iip1 62 if(pole_nord) ijb=ij_begin62 IF (pole_nord) ijb=ij_begin 63 63 64 64 DO ij = ijb,ije … … 66 66 END DO 67 67 68 if (.not. pole_sud) THEN68 IF (.NOT. pole_sud) THEN 69 69 hbxu(ije+1:ije+iip1,l) = 0 70 70 hbyv(ije+1:ije+iip1,l) = 0 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dudv1_loc.f90
r5106 r5117 33 33 ije=ij_end 34 34 35 if(pole_nord) ijb=ij_begin+iip136 if(pole_sud) ije=ij_end-iip135 IF (pole_nord) ijb=ij_begin+iip1 36 IF (pole_sud) ije=ij_end-iip1 37 37 38 38 DO ij = ijb, ije-1 … … 44 44 45 45 ! 46 if(pole_nord) ijb=ij_begin46 IF (pole_nord) ijb=ij_begin 47 47 48 48 DO ij = ijb, ije-1 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dudv2_loc.f90
r5106 r5117 37 37 ijb=ij_begin 38 38 ije=ij_end 39 if(pole_nord) ijb=ijb+iip140 if(pole_sud) ije=ije-iip139 IF (pole_nord) ijb=ijb+iip1 40 IF (pole_sud) ije=ije-iip1 41 41 42 42 DO ij = ijb, ije - 1 … … 55 55 ! 56 56 ! 57 if(pole_nord) ijb=ijb-iip157 IF (pole_nord) ijb=ijb-iip1 58 58 59 59 DO ij = ijb,ije -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynetat0_loc.F90
r5116 r5117 8 8 USE parallel_lmdz 9 9 USE infotrac, ONLY: nqtot, tracers, niso, iqIsoPha, iH2O, isoName 10 USE strings_mod, ONLY: maxlen, msg, strStack, real2str, int2str, strIdx10 USE lmdz_strings, ONLY: maxlen, msg, strStack, real2str, int2str, strIdx 11 11 USE netcdf, ONLY: nf90_open, nf90_nowrite, nf90_inquire_dimension, nf90_inq_varid, & 12 12 nf90_close, nf90_get_var, nf90_inquire_variable, nf90_noerr 13 USE readTracFiles_mod, ONLY: new2oldH2O, newHNO3, oldHNO3, getKey13 USE lmdz_readTracFiles, ONLY: new2oldH2O, newHNO3, oldHNO3, getKey 14 14 USE control_mod, ONLY: planet_type 15 15 USE lmdz_assert_eq, ONLY: assert_eq … … 182 182 iqParent = tracers(iq)%iqParent 183 183 IF(tracers(iq)%iso_iZone == 0) THEN 184 if(tnat1) THEN184 IF (tnat1) THEN 185 185 tnat=1.0 186 186 alpha_ideal=1.0 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynredem_loc.F90
r5114 r5117 7 7 USE parallel_lmdz 8 8 USE mod_hallo 9 USE strings_mod, ONLY: maxlen9 USE lmdz_strings, ONLY: maxlen 10 10 USE infotrac, ONLY: nqtot, tracers 11 11 USE netcdf, ONLY: nf90_create, nf90_def_dim, nf90_inq_varid, nf90_global, & … … 166 166 USE parallel_lmdz 167 167 USE mod_hallo 168 USE strings_mod, ONLY: maxlen168 USE lmdz_strings, ONLY: maxlen 169 169 USE infotrac, ONLY: nqtot, tracers, type_trac 170 170 USE control_mod -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_hyb_loc_m.F90
r5116 r5117 63 63 64 64 ! Sanity check 65 if(firstcall) THEN65 IF (firstcall) THEN 66 66 ! sanity checks for Shallow Water case (1 vertical layer) 67 if(llm==1) THEN68 if(kappa/=1) THEN67 IF (llm==1) THEN 68 IF (kappa/=1) THEN 69 69 CALL abort_gcm(modname, & 70 70 "kappa!=1 , but running in Shallow Water mode!!", 42) 71 71 endif 72 if(cpp/=r) THEN72 IF (cpp/=r) THEN 73 73 CALL abort_gcm(modname, & 74 74 "cpp!=r , but running in Shallow Water mode!!", 42) 75 75 endif 76 endif ! of if (llm. eq.1)76 endif ! of if (llm.EQ.1) 77 77 78 78 firstcall = .FALSE. … … 82 82 83 83 ! Specific behaviour for Shallow Water (1 vertical layer) case: 84 if(llm==1) THEN84 IF (llm==1) THEN 85 85 ! Compute pks(:),pk(:),pkf(:) 86 86 ijb = ij_begin … … 90 90 pks(ij) = (cpp / preff) * ps(ij) 91 91 pk(ij, 1) = .5 * pks(ij) 92 if(present(pkf)) pkf(ij, 1) = pk(ij, 1)92 IF (present(pkf)) pkf(ij, 1) = pk(ij, 1) 93 93 ENDDO 94 94 !$OMP ENDDO 95 95 96 96 !$OMP BARRIER 97 if(present(pkf)) THEN97 IF (present(pkf)) THEN 98 98 jjb = jj_begin 99 99 jje = jj_end … … 104 104 ! our work is done, exit routine 105 105 RETURN 106 endif ! of if (llm. eq.1)106 endif ! of if (llm.EQ.1) 107 107 108 108 ! General case: … … 169 169 ENDDO 170 170 171 if(present(pkf)) THEN171 IF (present(pkf)) THEN 172 172 ! calcul de pkf 173 173 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_milieu_loc_m.F90
r5116 r5117 56 56 57 57 ! Sanity check 58 if(firstcall) THEN58 IF (firstcall) THEN 59 59 ! sanity checks for Shallow Water case (1 vertical layer) 60 if(llm==1) THEN61 if(kappa/=1) THEN60 IF (llm==1) THEN 61 IF (kappa/=1) THEN 62 62 CALL abort_gcm(modname, & 63 63 "kappa!=1 , but running in Shallow Water mode!!",42) 64 64 endif 65 if(cpp/=r) THEN65 IF (cpp/=r) THEN 66 66 CALL abort_gcm(modname, & 67 67 "cpp!=r , but running in Shallow Water mode!!",42) 68 68 endif 69 endif ! of if (llm. eq.1)69 endif ! of if (llm.EQ.1) 70 70 71 71 firstcall=.FALSE. … … 75 75 76 76 ! Specific behaviour for Shallow Water (1 vertical layer) case: 77 if(llm==1) THEN77 IF (llm==1) THEN 78 78 ! Compute pks(:),pk(:),pkf(:) 79 79 ijb=ij_begin … … 83 83 pks(ij) = (cpp/preff) * ps(ij) 84 84 pk(ij,1) = .5*pks(ij) 85 if(present(pkf)) pkf(ij,1)=pk(ij,1)85 IF (present(pkf)) pkf(ij,1)=pk(ij,1) 86 86 ENDDO 87 87 !$OMP ENDDO 88 88 89 89 !$OMP BARRIER 90 if(present(pkf)) THEN90 IF (present(pkf)) THEN 91 91 jjb=jj_begin 92 92 jje=jj_end … … 97 97 ! our work is done, exit routine 98 98 RETURN 99 endif ! of if (llm. eq.1)99 endif ! of if (llm.EQ.1) 100 100 101 101 ! General case: … … 140 140 !$OMP ENDDO NOWAIT 141 141 142 if(present(pkf)) THEN142 IF (present(pkf)) THEN 143 143 ! calcul de pkf 144 144 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/filtreg_p.F90
r5113 r5117 99 99 !-------------------------------------------------------c 100 100 101 IF(ifiltre==1. or.ifiltre==-1) &101 IF(ifiltre==1.OR.ifiltre==-1) & 102 102 CALL abort_gcm("fitreg_p","Pas de transformee simple& 103 103 &dans cette version",1) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/fluxstokenc_p.f90
r5116 r5117 10 10 USE bands 11 11 USE times 12 USE Vampir12 USE lmdz_vampir 13 13 USE write_field_loc 14 14 … … 50 50 ijbv = ij_begin - iip1 51 51 ijev = ij_end 52 if(pole_nord) ijbv = ij_begin53 if(pole_sud) ijev = ij_end - iip152 IF (pole_nord) ijbv = ij_begin 53 IF (pole_sud) ijev = ij_end - iip1 54 54 55 55 IF(pasflx==0) THEN … … 116 116 !$OMP ENDDO NOWAIT 117 117 118 if(pole_sud) ije = ij_end - iip1118 IF (pole_sud) ije = ij_end - iip1 119 119 120 120 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/friction_loc.f90
r5116 r5117 29 29 30 30 ! arguments: 31 REAL,INTENT( inout) :: ucov( iip1,jjb_u:jje_u,llm )32 REAL,INTENT( inout) :: vcov( iip1,jjb_v:jje_v,llm )33 REAL,INTENT( in) :: pdt ! time step31 REAL,INTENT(INOUT) :: ucov( iip1,jjb_u:jje_u,llm ) 32 REAL,INTENT(INOUT) :: vcov( iip1,jjb_v:jje_v,llm ) 33 REAL,INTENT(IN) :: pdt ! time step 34 34 35 35 ! local variables: … … 51 51 ! set friction type 52 52 CALL getin("friction_type",friction_type) 53 if ((friction_type<0).or.(friction_type>1)) THEN53 IF ((friction_type<0).OR.(friction_type>1)) THEN 54 54 abort_message="wrong friction type" 55 55 WRITE(lunout,*)'Friction: wrong friction type',friction_type … … 60 60 !$OMP END SINGLE COPYPRIVATE(friction_type,firstcall) 61 61 62 if(friction_type==0) then ! friction on first layer only62 IF (friction_type==0) then ! friction on first layer only 63 63 !$OMP SINGLE 64 64 ! calcul des composantes au carre du vent naturel 65 65 jjb=jj_begin 66 66 jje=jj_end+1 67 if(pole_sud) jje=jj_end67 IF (pole_sud) jje=jj_end 68 68 69 69 do j=jjb,jje … … 75 75 jjb=jj_begin-1 76 76 jje=jj_end+1 77 if(pole_nord) jjb=jj_begin78 if(pole_sud) jje=jj_end-177 IF (pole_nord) jjb=jj_begin 78 IF (pole_sud) jje=jj_end-1 79 79 80 80 do j=jjb,jje … … 87 87 jjb=jj_begin 88 88 jje=jj_end+1 89 if(pole_nord) jjb=jj_begin+190 if(pole_sud) jje=jj_end-189 IF (pole_nord) jjb=jj_begin+1 90 IF (pole_sud) jje=jj_end-1 91 91 92 92 do j=jjb,jje … … 99 99 ! les deux composantes du vent au pole sont obtenues comme 100 100 ! premiers modes de fourier de v pres du pole 101 if(pole_nord) THEN101 IF (pole_nord) THEN 102 102 upoln=0. 103 103 vpoln=0. … … 116 116 enddo 117 117 118 endif118 ENDIF 119 119 120 if(pole_sud) THEN120 IF (pole_sud) THEN 121 121 upols=0. 122 122 vpols=0. … … 134 134 enddo 135 135 136 endif136 ENDIF 137 137 138 138 ! calcul du frottement au sol. … … 140 140 jjb=jj_begin 141 141 jje=jj_end 142 if(pole_nord) jjb=jj_begin+1143 if(pole_sud) jje=jj_end-1142 IF (pole_nord) jjb=jj_begin+1 143 IF (pole_sud) jje=jj_end-1 144 144 145 145 do j=jjb,jje … … 153 153 jjb=jj_begin 154 154 jje=jj_end 155 if(pole_sud) jje=jj_end-1155 IF (pole_sud) jje=jj_end-1 156 156 157 157 do j=jjb,jje … … 163 163 enddo 164 164 !$OMP END SINGLE 165 endif ! of if (friction_type.eq.0)165 ENDIF ! of if (friction_type.EQ.0) 166 166 167 if(friction_type==1) THEN167 IF (friction_type==1) THEN 168 168 ! for ucov() 169 169 jjb=jj_begin 170 170 jje=jj_end 171 if(pole_nord) jjb=jj_begin+1172 if(pole_sud) jje=jj_end-1171 IF (pole_nord) jjb=jj_begin+1 172 IF (pole_sud) jje=jj_end-1 173 173 174 174 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 182 182 jjb=jj_begin 183 183 jje=jj_end 184 if(pole_sud) jje=jj_end-1184 IF (pole_sud) jje=jj_end-1 185 185 186 186 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 190 190 enddo 191 191 !$OMP END DO 192 endif ! of if (friction_type.eq.1)192 ENDIF ! of if (friction_type.EQ.1) 193 193 194 194 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gcm.F90
r5116 r5117 87 87 LOGICAL lafin 88 88 89 realtime_step, t_wrt, t_ops89 REAL time_step, t_wrt, t_ops 90 90 91 91 !+jld variables test conservation energie … … 101 101 102 102 103 character (len=80) :: dynhist_file, dynhistave_file104 character (len=20) :: modname105 character (len=80) :: abort_message103 CHARACTER (LEN=80) :: dynhist_file, dynhistave_file 104 CHARACTER (LEN=20) :: modname 105 CHARACTER (LEN=80) :: abort_message 106 106 ! locales pour gestion du temps 107 107 INTEGER :: an, mois, jour 108 108 REAL :: heure 109 109 ! needed for xios interface 110 character (len=10) :: xios_cal_type110 CHARACTER (LEN=10) :: xios_cal_type 111 111 INTEGER :: anref, moisref, jourref 112 112 REAL :: heureref … … 132 132 133 133 CALL conf_gcm( 99, .TRUE. ) 134 if(mod(iphysiq, iperiod) /= 0) CALL abort_gcm("conf_gcm", &134 IF (mod(iphysiq, iperiod) /= 0) CALL abort_gcm("conf_gcm", & 135 135 "iphysiq must be a multiple of iperiod", 1) 136 136 … … 154 154 155 155 CALL set_bands 156 if(mpi_rank==0) CALL WriteBands156 IF (mpi_rank==0) CALL WriteBands 157 157 CALL Set_Distrib(distrib_caldyn) 158 158 … … 173 173 ! calend = 'earth_365d' 174 174 175 if(calend == 'earth_360d') THEN175 IF (calend == 'earth_360d') THEN 176 176 CALL ioconf_calendar('360_day') 177 177 WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre a 360 jours/an' 178 178 xios_cal_type='d360' 179 else if(calend == 'earth_365d') THEN179 ELSE IF (calend == 'earth_365d') THEN 180 180 CALL ioconf_calendar('noleap') 181 181 WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre a 365 jours/an' 182 182 xios_cal_type='noleap' 183 else if(calend == 'gregorian') THEN183 ELSE IF (calend == 'gregorian') THEN 184 184 CALL ioconf_calendar('gregorian') 185 185 WRITE(lunout,*)'CALENDRIER CHOISI: Terrestre bissextile' … … 188 188 abort_message = 'Mauvais choix de calendrier' 189 189 CALL abort_gcm(modname,abort_message,1) 190 endif190 ENDIF 191 191 192 192 … … 212 212 213 213 ! lecture du fichier start.nc 214 if(read_start) THEN214 IF (read_start) THEN 215 215 ! we still need to run iniacademic to initialize some 216 216 ! constants & fields, if we run the 'newtonian' or 'SW' cases: 217 if(iflag_phys/=1) THEN217 IF (iflag_phys/=1) THEN 218 218 CALL iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0) 219 219 endif 220 220 221 ! if (planet_type. eq."earth") THEN221 ! if (planet_type.EQ."earth") THEN 222 222 ! Load an Earth-format start file 223 223 CALL dynetat0_loc("start.nc",vcov,ucov, & 224 224 teta,q,masse,ps,phis, time_0) 225 ! endif ! of if (planet_type. eq."earth")225 ! endif ! of if (planet_type.EQ."earth") 226 226 227 227 ! WRITE(73,*) 'ucov',ucov … … 231 231 ! WRITE(77,*) 'q',q 232 232 233 endif! of if (read_start)233 ENDIF ! of if (read_start) 234 234 235 235 ! le cas echeant, creation d un etat initial 236 236 IF (prt_level > 9) WRITE(lunout,*) & 237 237 'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT' 238 if (.not.read_start) THEN238 IF (.NOT.read_start) THEN 239 239 start_time=0. 240 240 annee_ref=anneeref 241 241 CALL iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0) 242 endif242 ENDIF 243 243 244 244 !----------------------------------------------------------------------- … … 287 287 WRITE(lunout,*) & 288 288 'GCM: On reinitialise a la date lue dans gcm.def' 289 ELSE IF (annee_ref /= anneeref . or. day_ref /= dayref) THEN289 ELSE IF (annee_ref /= anneeref .OR. day_ref /= dayref) THEN 290 290 WRITE(lunout,*) & 291 291 'GCM: Attention les dates initiales lues dans le fichier' … … 297 297 WRITE(lunout,*)' Pas de remise a zero' 298 298 ENDIF 299 ! if (annee_ref . ne. anneeref .or. day_ref .ne. dayref) THEN299 ! if (annee_ref .NE. anneeref .OR. day_ref .NE. dayref) THEN 300 300 ! WRITE(lunout,*) 301 301 ! . 'GCM: Attention les dates initiales lues dans le fichier' … … 305 305 ! WRITE(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 306 306 ! WRITE(lunout,*)' day_ref=',day_ref," dayref=",dayref 307 ! if (raz_date . ne. 1) THEN307 ! if (raz_date .NE. 1) THEN 308 308 ! WRITE(lunout,*) 309 309 ! . 'GCM: On garde les dates du fichier restart' … … 337 337 WRITE(lunout,*)jD_ref+jH_ref,anref, moisref, jourref, heureref 338 338 339 if(iflag_phys==1) THEN339 IF (iflag_phys==1) THEN 340 340 ! these initialisations have already been done (via iniacademic) 341 341 ! if running in SW or Newtonian mode … … 355 355 ! -------------------------- 356 356 CALL inifilr 357 endif ! of if (iflag_phys.eq.1)357 ENDIF ! of if (iflag_phys.EQ.1) 358 358 359 359 !----------------------------------------------------------------------- … … 369 369 370 370 371 if(nday>=0) THEN371 IF (nday>=0) THEN 372 372 day_end = day_ini + nday 373 373 else 374 374 day_end = day_ini - nday/day_step 375 endif375 ENDIF 376 376 377 377 WRITE(lunout,300)day_ini,day_end … … 395 395 istphy=istdyn/iphysiq 396 396 397 IF ((iflag_phys==1). or.(iflag_phys>=100)) THEN397 IF ((iflag_phys==1).OR.(iflag_phys>=100)) THEN 398 398 ! Physics: 399 399 IF (CPPKEY_PHYS) THEN … … 404 404 iflag_phys) 405 405 END IF 406 ENDIF ! of IF ((iflag_phys==1). or.(iflag_phys>=100))407 408 409 ! if (planet_type. eq."earth") THEN406 ENDIF ! of IF ((iflag_phys==1).OR.(iflag_phys>=100)) 407 408 409 ! if (planet_type.EQ."earth") THEN 410 410 ! Write an Earth-format restart file 411 411 CALL dynredem0_loc("restart.nc", day_end, phis) … … 415 415 416 416 time_step = zdtvr 417 if(ok_dyn_ins) THEN417 IF (ok_dyn_ins) THEN 418 418 ! initialize output file for instantaneous outputs 419 419 ! t_ops = iecri * daysec ! do operations every t_ops … … 433 433 434 434 ! setting up DYN3D/XIOS inerface 435 if(ok_dyn_xios) THEN435 IF (ok_dyn_xios) THEN 436 436 CALL xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an, & 437 437 mois, jour, heure, zdtvr) 438 endif438 ENDIF 439 439 440 440 !----------------------------------------------------------------------- -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gr_v_scal_loc.f90
r5116 r5117 49 49 ijb=ij_begin 50 50 ije=ij_end 51 if(pole_nord) ijb=ij_begin+iip152 if(pole_sud) ije=ij_end-iip151 IF (pole_nord) ijb=ij_begin+iip1 52 IF (pole_sud) ije=ij_end-iip1 53 53 54 54 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 62 62 !$OMP ENDDO NOWAIT 63 63 64 if(pole_nord) THEN64 IF (pole_nord) THEN 65 65 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 66 66 DO l=1,nx … … 70 70 ENDDO 71 71 !$OMP ENDDO NOWAIT 72 endif72 ENDIF 73 73 74 if(pole_sud) THEN74 IF (pole_sud) THEN 75 75 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 76 76 DO l=1,nx … … 80 80 ENDDO 81 81 !$OMP ENDDO NOWAIT 82 endif82 ENDIF 83 83 84 84 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/grad_loc.f90
r5105 r5117 40 40 ijb=ij_begin-iip1 41 41 ije=ij_end 42 if(pole_nord) ijb=ij_begin43 if(pole_sud) ije=ij_end-iip142 IF (pole_nord) ijb=ij_begin 43 IF (pole_sud) ije=ij_end-iip1 44 44 45 45 DO ij = ijb,ije -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/grad_p.f90
r5105 r5117 40 40 ijb=ij_begin-iip1 41 41 ije=ij_end 42 if(pole_nord) ijb=ij_begin43 if(pole_sud) ije=ij_end-iip142 IF (pole_nord) ijb=ij_begin 43 IF (pole_sud) ije=ij_end-iip1 44 44 45 45 DO ij = ijb,ije -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gradiv2_loc.f90
r5116 r5117 133 133 DO l = 1, klevel 134 134 135 if(pole_sud) ije=ij_end135 IF (pole_sud) ije=ij_end 136 136 DO ij = ijb, ije 137 137 gdx_out( ij,l ) = gdx( ij,l ) * nugrads 138 138 ENDDO 139 139 140 if(pole_sud) ije=ij_end-iip1140 IF (pole_sud) ije=ij_end-iip1 141 141 DO ij = ijb, ije 142 142 gdy_out( ij,l ) = gdy( ij,l ) * nugrads -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupe_loc.f90
r5116 r5117 35 35 INTEGER :: i, j, l 36 36 37 logical:: firstcall37 LOGICAL :: firstcall 38 38 save firstcall 39 39 !$OMP THREADPRIVATE(firstcall) … … 62 62 jjb = jj_begin - 1 63 63 jje = jj_end 64 if(pole_nord) jjb = jj_begin65 if(pole_sud) jje = jj_end - 164 IF (pole_nord) jjb = jj_begin 65 IF (pole_sud) jje = jj_end - 1 66 66 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 67 67 do l = 1, llm … … 81 81 jjb = jj_begin 82 82 jje = jj_end 83 if(pole_nord) jjb = jj_begin + 184 if(pole_sud) jje = jj_end - 183 IF (pole_nord) jjb = jj_begin + 1 84 IF (pole_sud) jje = jj_end - 1 85 85 86 86 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 113 113 enddo 114 114 115 if (.not. pole_sud) THEN115 IF (.NOT. pole_sud) THEN 116 116 zconvmm(:, jj_end + 1, :) = 0 117 117 !ym wm(:,jj_end+1,:)=0 118 endif118 ENDIF 119 119 120 120 !$OMP END MASTER -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/guide_loc_mod.F90
r5116 r5117 1 1 MODULE guide_loc_mod 2 2 3 !=======================================================================4 ! Auteur: F.Hourdin5 ! F. Codron 01/096 !=======================================================================3 !======================================================================= 4 ! Auteur: F.Hourdin 5 ! F. Codron 01/09 6 !======================================================================= 7 7 8 8 USE getparam, ONLY: ini_getparam, fin_getparam, getpar 9 9 USE Write_Field_loc 10 usenetcdf, ONLY: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close, &10 USE netcdf, ONLY: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close, & 11 11 nf90_inq_dimid, nf90_inquire_dimension, nf90_inq_dimid, & 12 12 nf90_inquire_dimension, nf90_enddef, nf90_def_dim, nf90_put_var, nf90_noerr, nf90_close, nf90_inq_varid, & … … 14 14 nf90_create, nf90_def_var, nf90_open 15 15 USE parallel_lmdz 16 USE pres2lev_mod, ONLY: pres2lev16 USE lmdz_pres2lev, ONLY: pres2lev 17 17 18 18 IMPLICIT NONE 19 19 20 ! ---------------------------------------------21 ! Declarations des cles logiques et parametres 22 ! ---------------------------------------------23 INTEGER, PRIVATE, SAVE :: iguide_read,iguide_int,iguide_sav24 INTEGER, PRIVATE, SAVE 25 LOGICAL, PRIVATE, SAVE :: guide_u,guide_v,guide_T,guide_Q,guide_P26 LOGICAL, PRIVATE, SAVE :: guide_hr,guide_teta27 LOGICAL, PRIVATE, SAVE :: guide_BL,guide_reg,guide_add,gamma4,guide_zon28 LOGICAL, PRIVATE, SAVE :: invert_p,invert_y,ini_anal29 LOGICAL, PRIVATE, SAVE :: guide_2D,guide_sav,guide_modele30 !FC31 LOGICAL, PRIVATE, SAVE 32 33 REAL, PRIVATE, SAVE :: tau_min_u,tau_max_u34 REAL, PRIVATE, SAVE :: tau_min_v,tau_max_v35 REAL, PRIVATE, SAVE :: tau_min_T,tau_max_T36 REAL, PRIVATE, SAVE :: tau_min_Q,tau_max_Q37 REAL, PRIVATE, SAVE :: tau_min_P,tau_max_P38 39 REAL, PRIVATE, SAVE :: lat_min_g,lat_max_g40 REAL, PRIVATE, SAVE :: lon_min_g,lon_max_g41 REAL, PRIVATE, SAVE :: tau_lon,tau_lat42 43 REAL, PRIVATE, SAVE 44 45 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_u,alpha_v46 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_T,alpha_Q47 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_P,alpha_pcor48 49 ! ---------------------------------------------50 ! Variables de guidage51 ! ---------------------------------------------52 ! Variables des fichiers de guidage53 REAL, ALLOCATABLE, DIMENSION(:, :,:), PRIVATE, SAVE :: unat1,unat254 REAL, ALLOCATABLE, DIMENSION(:, :,:), PRIVATE, SAVE :: vnat1,vnat255 REAL, ALLOCATABLE, DIMENSION(:, :,:), PRIVATE, SAVE :: tnat1,tnat256 REAL, ALLOCATABLE, DIMENSION(:, :,:), PRIVATE, SAVE :: qnat1,qnat257 REAL, ALLOCATABLE, DIMENSION(:, :,:), PRIVATE, SAVE :: pnat1,pnat258 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: psnat1,psnat259 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: apnc,bpnc60 ! Variables aux dimensions du modele61 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: ugui1,ugui262 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: vgui1,vgui263 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: tgui1,tgui264 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: qgui1,qgui265 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: psgui1,psgui266 67 INTEGER, SAVE,PRIVATE :: ijbu,ijbv,ijeu,ijev !,ijnu,ijnv68 INTEGER, SAVE,PRIVATE :: jjbu,jjbv,jjeu,jjev,jjnu,jjnv20 ! --------------------------------------------- 21 ! Declarations des cles logiques et parametres 22 ! --------------------------------------------- 23 INTEGER, PRIVATE, SAVE :: iguide_read, iguide_int, iguide_sav 24 INTEGER, PRIVATE, SAVE :: nlevnc, guide_plevs 25 LOGICAL, PRIVATE, SAVE :: guide_u, guide_v, guide_T, guide_Q, guide_P 26 LOGICAL, PRIVATE, SAVE :: guide_hr, guide_teta 27 LOGICAL, PRIVATE, SAVE :: guide_BL, guide_reg, guide_add, gamma4, guide_zon 28 LOGICAL, PRIVATE, SAVE :: invert_p, invert_y, ini_anal 29 LOGICAL, PRIVATE, SAVE :: guide_2D, guide_sav, guide_modele 30 !FC 31 LOGICAL, PRIVATE, SAVE :: convert_Pa 32 33 REAL, PRIVATE, SAVE :: tau_min_u, tau_max_u 34 REAL, PRIVATE, SAVE :: tau_min_v, tau_max_v 35 REAL, PRIVATE, SAVE :: tau_min_T, tau_max_T 36 REAL, PRIVATE, SAVE :: tau_min_Q, tau_max_Q 37 REAL, PRIVATE, SAVE :: tau_min_P, tau_max_P 38 39 REAL, PRIVATE, SAVE :: lat_min_g, lat_max_g 40 REAL, PRIVATE, SAVE :: lon_min_g, lon_max_g 41 REAL, PRIVATE, SAVE :: tau_lon, tau_lat 42 43 REAL, PRIVATE, SAVE :: plim_guide_BL 44 45 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_u, alpha_v 46 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_T, alpha_Q 47 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: alpha_P, alpha_pcor 48 49 ! --------------------------------------------- 50 ! Variables de guidage 51 ! --------------------------------------------- 52 ! Variables des fichiers de guidage 53 REAL, ALLOCATABLE, DIMENSION(:, :, :), PRIVATE, SAVE :: unat1, unat2 54 REAL, ALLOCATABLE, DIMENSION(:, :, :), PRIVATE, SAVE :: vnat1, vnat2 55 REAL, ALLOCATABLE, DIMENSION(:, :, :), PRIVATE, SAVE :: tnat1, tnat2 56 REAL, ALLOCATABLE, DIMENSION(:, :, :), PRIVATE, SAVE :: qnat1, qnat2 57 REAL, ALLOCATABLE, DIMENSION(:, :, :), PRIVATE, SAVE :: pnat1, pnat2 58 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: psnat1, psnat2 59 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: apnc, bpnc 60 ! Variables aux dimensions du modele 61 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: ugui1, ugui2 62 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: vgui1, vgui2 63 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: tgui1, tgui2 64 REAL, ALLOCATABLE, DIMENSION(:, :), PRIVATE, SAVE :: qgui1, qgui2 65 REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE :: psgui1, psgui2 66 67 INTEGER, SAVE, PRIVATE :: ijbu, ijbv, ijeu, ijev !,ijnu,ijnv 68 INTEGER, SAVE, PRIVATE :: jjbu, jjbv, jjeu, jjev, jjnu, jjnv 69 69 70 70 71 71 CONTAINS 72 !=======================================================================72 !======================================================================= 73 73 74 74 SUBROUTINE guide_init … … 78 78 79 79 IMPLICIT NONE 80 80 81 81 INCLUDE "dimensions.h" 82 82 INCLUDE "paramet.h" 83 83 84 INTEGER :: error,ncidpl,rid,rcod85 CHARACTER (len = 80) 86 CHARACTER (len = 20) 87 CHARACTER (len = 20) 88 89 ! ---------------------------------------------90 ! Lecture des parametres: 91 ! ---------------------------------------------84 INTEGER :: error, ncidpl, rid, rcod 85 CHARACTER (len = 80) :: abort_message 86 CHARACTER (len = 20) :: modname = 'guide_init' 87 CHARACTER (len = 20) :: namedim 88 89 ! --------------------------------------------- 90 ! Lecture des parametres: 91 ! --------------------------------------------- 92 92 CALL ini_getparam("nudging_parameters_out.txt") 93 ! Variables guidees94 CALL getpar('guide_u', .TRUE.,guide_u,'guidage de u')95 CALL getpar('guide_v', .TRUE.,guide_v,'guidage de v')96 CALL getpar('guide_T', .TRUE.,guide_T,'guidage de T')97 CALL getpar('guide_P', .TRUE.,guide_P,'guidage de P')98 CALL getpar('guide_Q', .TRUE.,guide_Q,'guidage de Q')99 CALL getpar('guide_hr', .TRUE.,guide_hr,'guidage de Q par H.R')100 CALL getpar('guide_teta', .FALSE.,guide_teta,'guidage de T par Teta')101 102 CALL getpar('guide_add', .FALSE.,guide_add,'foréage constant?')103 CALL getpar('guide_zon', .FALSE.,guide_zon,'guidage moy zonale')104 if (guide_zon .and. abs(grossismx - 1.) > 0.01) &105 CALL abort_gcm("guide_init", &106 "zonal nudging requires grid regular in longitude", 1)107 108 ! Constantes de rappel. Unite : fraction de jour109 CALL getpar('tau_min_u', 0.02,tau_min_u,'Cste de rappel min, u')110 CALL getpar('tau_max_u', 10., tau_max_u,'Cste de rappel max, u')111 CALL getpar('tau_min_v', 0.02,tau_min_v,'Cste de rappel min, v')112 CALL getpar('tau_max_v', 10., tau_max_v,'Cste de rappel max, v')113 CALL getpar('tau_min_T', 0.02,tau_min_T,'Cste de rappel min, T')114 CALL getpar('tau_max_T', 10., tau_max_T,'Cste de rappel max, T')115 CALL getpar('tau_min_Q', 0.02,tau_min_Q,'Cste de rappel min, Q')116 CALL getpar('tau_max_Q', 10., tau_max_Q,'Cste de rappel max, Q')117 CALL getpar('tau_min_P', 0.02,tau_min_P,'Cste de rappel min, P')118 CALL getpar('tau_max_P', 10., tau_max_P,'Cste de rappel max, P')119 CALL getpar('gamma4', .FALSE.,gamma4,'Zone sans rappel elargie')120 CALL getpar('guide_BL', .TRUE.,guide_BL,'guidage dans C.Lim')121 CALL getpar('plim_guide_BL', 85000.,plim_guide_BL,'BL top presnivs value')122 123 ! Sauvegarde du forçage124 CALL getpar('guide_sav', .FALSE.,guide_sav,'sauvegarde guidage')125 CALL getpar('iguide_sav', 4,iguide_sav,'freq. sauvegarde guidage')93 ! Variables guidees 94 CALL getpar('guide_u', .TRUE., guide_u, 'guidage de u') 95 CALL getpar('guide_v', .TRUE., guide_v, 'guidage de v') 96 CALL getpar('guide_T', .TRUE., guide_T, 'guidage de T') 97 CALL getpar('guide_P', .TRUE., guide_P, 'guidage de P') 98 CALL getpar('guide_Q', .TRUE., guide_Q, 'guidage de Q') 99 CALL getpar('guide_hr', .TRUE., guide_hr, 'guidage de Q par H.R') 100 CALL getpar('guide_teta', .FALSE., guide_teta, 'guidage de T par Teta') 101 102 CALL getpar('guide_add', .FALSE., guide_add, 'foréage constant?') 103 CALL getpar('guide_zon', .FALSE., guide_zon, 'guidage moy zonale') 104 IF (guide_zon .AND. abs(grossismx - 1.) > 0.01) & 105 CALL abort_gcm("guide_init", & 106 "zonal nudging requires grid regular in longitude", 1) 107 108 ! Constantes de rappel. Unite : fraction de jour 109 CALL getpar('tau_min_u', 0.02, tau_min_u, 'Cste de rappel min, u') 110 CALL getpar('tau_max_u', 10., tau_max_u, 'Cste de rappel max, u') 111 CALL getpar('tau_min_v', 0.02, tau_min_v, 'Cste de rappel min, v') 112 CALL getpar('tau_max_v', 10., tau_max_v, 'Cste de rappel max, v') 113 CALL getpar('tau_min_T', 0.02, tau_min_T, 'Cste de rappel min, T') 114 CALL getpar('tau_max_T', 10., tau_max_T, 'Cste de rappel max, T') 115 CALL getpar('tau_min_Q', 0.02, tau_min_Q, 'Cste de rappel min, Q') 116 CALL getpar('tau_max_Q', 10., tau_max_Q, 'Cste de rappel max, Q') 117 CALL getpar('tau_min_P', 0.02, tau_min_P, 'Cste de rappel min, P') 118 CALL getpar('tau_max_P', 10., tau_max_P, 'Cste de rappel max, P') 119 CALL getpar('gamma4', .FALSE., gamma4, 'Zone sans rappel elargie') 120 CALL getpar('guide_BL', .TRUE., guide_BL, 'guidage dans C.Lim') 121 CALL getpar('plim_guide_BL', 85000., plim_guide_BL, 'BL top presnivs value') 122 123 ! Sauvegarde du forçage 124 CALL getpar('guide_sav', .FALSE., guide_sav, 'sauvegarde guidage') 125 CALL getpar('iguide_sav', 4, iguide_sav, 'freq. sauvegarde guidage') 126 126 ! frequences f>0: fx/jour; f<0: tous les f jours; f=0: 1 seule fois. 127 127 IF (iguide_sav>0) THEN 128 iguide_sav=day_step/iguide_sav128 iguide_sav = day_step / iguide_sav 129 129 ELSE if (iguide_sav == 0) THEN 130 130 iguide_sav = huge(0) 131 131 ELSE 132 iguide_sav=day_step*iguide_sav133 ENDIF 134 135 ! Guidage regional seulement (sinon constant ou suivant le zoom)136 CALL getpar('guide_reg', .FALSE.,guide_reg,'guidage regional')137 CALL getpar('lat_min_g', -90.,lat_min_g,'Latitude mini guidage ')138 CALL getpar('lat_max_g', 90., lat_max_g,'Latitude maxi guidage ')139 CALL getpar('lon_min_g', -180.,lon_min_g,'longitude mini guidage ')140 CALL getpar('lon_max_g', 180., lon_max_g,'longitude maxi guidage ')141 CALL getpar('tau_lat', 5., tau_lat,'raideur lat guide regional ')142 CALL getpar('tau_lon', 5., tau_lon,'raideur lon guide regional ')143 144 ! Parametres pour lecture des fichiers145 CALL getpar('iguide_read', 4,iguide_read,'freq. lecture guidage')146 CALL getpar('iguide_int', 4,iguide_int,'freq. interpolation vert')132 iguide_sav = day_step * iguide_sav 133 ENDIF 134 135 ! Guidage regional seulement (sinon constant ou suivant le zoom) 136 CALL getpar('guide_reg', .FALSE., guide_reg, 'guidage regional') 137 CALL getpar('lat_min_g', -90., lat_min_g, 'Latitude mini guidage ') 138 CALL getpar('lat_max_g', 90., lat_max_g, 'Latitude maxi guidage ') 139 CALL getpar('lon_min_g', -180., lon_min_g, 'longitude mini guidage ') 140 CALL getpar('lon_max_g', 180., lon_max_g, 'longitude maxi guidage ') 141 CALL getpar('tau_lat', 5., tau_lat, 'raideur lat guide regional ') 142 CALL getpar('tau_lon', 5., tau_lon, 'raideur lon guide regional ') 143 144 ! Parametres pour lecture des fichiers 145 CALL getpar('iguide_read', 4, iguide_read, 'freq. lecture guidage') 146 CALL getpar('iguide_int', 4, iguide_int, 'freq. interpolation vert') 147 147 IF (iguide_int==0) THEN 148 iguide_int=1148 iguide_int = 1 149 149 ELSEIF (iguide_int>0) THEN 150 iguide_int=day_step/iguide_int150 iguide_int = day_step / iguide_int 151 151 ELSE 152 iguide_int=day_step*iguide_int153 ENDIF 154 CALL getpar('guide_plevs', 0,guide_plevs,'niveaux pression fichiers guidage')152 iguide_int = day_step * iguide_int 153 ENDIF 154 CALL getpar('guide_plevs', 0, guide_plevs, 'niveaux pression fichiers guidage') 155 155 ! Pour compatibilite avec ancienne version avec guide_modele 156 CALL getpar('guide_modele', .FALSE.,guide_modele,'niveaux pression ap+bp*psol')156 CALL getpar('guide_modele', .FALSE., guide_modele, 'niveaux pression ap+bp*psol') 157 157 IF (guide_modele) THEN 158 guide_plevs=1159 ENDIF 160 !FC161 CALL getpar('convert_Pa', .TRUE.,convert_Pa,'Convert Pressure levels in Pa')158 guide_plevs = 1 159 ENDIF 160 !FC 161 CALL getpar('convert_Pa', .TRUE., convert_Pa, 'Convert Pressure levels in Pa') 162 162 ! Fin raccord 163 CALL getpar('ini_anal', .FALSE.,ini_anal,'Etat initial = analyse')164 CALL getpar('guide_invertp', .TRUE.,invert_p,'niveaux p inverses')165 CALL getpar('guide_inverty', .TRUE.,invert_y,'inversion N-S')166 CALL getpar('guide_2D', .FALSE.,guide_2D,'fichier guidage lat-P')163 CALL getpar('ini_anal', .FALSE., ini_anal, 'Etat initial = analyse') 164 CALL getpar('guide_invertp', .TRUE., invert_p, 'niveaux p inverses') 165 CALL getpar('guide_inverty', .TRUE., invert_y, 'inversion N-S') 166 CALL getpar('guide_2D', .FALSE., guide_2D, 'fichier guidage lat-P') 167 167 168 168 CALL fin_getparam 169 170 ! ---------------------------------------------171 ! Determination du nombre de niveaux verticaux172 ! des fichiers guidage173 ! ---------------------------------------------174 ncidpl =-99175 if(guide_plevs==1) THEN176 if(ncidpl==-99) THEN177 rcod=nf90_open('apbp.nc',nf90_nowrite, ncidpl)178 if(rcod/=nf90_noerr) THEN179 abort_message=' Nudging error -> no file apbp.nc'180 CALL abort_gcm(modname,abort_message,1)181 182 169 170 ! --------------------------------------------- 171 ! Determination du nombre de niveaux verticaux 172 ! des fichiers guidage 173 ! --------------------------------------------- 174 ncidpl = -99 175 IF (guide_plevs==1) THEN 176 IF (ncidpl==-99) THEN 177 rcod = nf90_open('apbp.nc', nf90_nowrite, ncidpl) 178 IF (rcod/=nf90_noerr) THEN 179 abort_message = ' Nudging error -> no file apbp.nc' 180 CALL abort_gcm(modname, abort_message, 1) 181 endif 182 endif 183 183 elseif (guide_plevs==2) THEN 184 if(ncidpl==-99) THEN185 rcod=nf90_open('P.nc',nf90_nowrite,ncidpl)186 if(rcod/=nf90_noerr) THEN187 abort_message=' Nudging error -> no file P.nc'188 CALL abort_gcm(modname,abort_message,1)189 190 184 IF (ncidpl==-99) THEN 185 rcod = nf90_open('P.nc', nf90_nowrite, ncidpl) 186 IF (rcod/=nf90_noerr) THEN 187 abort_message = ' Nudging error -> no file P.nc' 188 CALL abort_gcm(modname, abort_message, 1) 189 endif 190 endif 191 191 192 192 elseif (guide_u) THEN 193 if (ncidpl==-99) THEN 194 rcod=nf90_open('u.nc',nf90_nowrite,ncidpl) 195 if (rcod/=nf90_noerr) THEN 196 abort_message=' Nudging error -> no file u.nc' 197 CALL abort_gcm(modname,abort_message,1) 198 endif 199 200 endif 201 193 IF (ncidpl==-99) THEN 194 rcod = nf90_open('u.nc', nf90_nowrite, ncidpl) 195 IF (rcod/=nf90_noerr) THEN 196 abort_message = ' Nudging error -> no file u.nc' 197 CALL abort_gcm(modname, abort_message, 1) 198 endif 199 200 endif 202 201 203 202 elseif (guide_v) THEN 204 if (ncidpl==-99) THEN 205 rcod=nf90_open('v.nc',nf90_nowrite,ncidpl) 206 if (rcod/=nf90_noerr) THEN 207 abort_message=' Nudging error -> no file v.nc' 208 CALL abort_gcm(modname,abort_message,1) 209 endif 210 endif 211 212 203 IF (ncidpl==-99) THEN 204 rcod = nf90_open('v.nc', nf90_nowrite, ncidpl) 205 IF (rcod/=nf90_noerr) THEN 206 abort_message = ' Nudging error -> no file v.nc' 207 CALL abort_gcm(modname, abort_message, 1) 208 endif 209 endif 210 213 211 elseif (guide_T) THEN 214 if (ncidpl==-99) THEN 215 rcod=nf90_open('T.nc',nf90_nowrite,ncidpl) 216 if (rcod/=nf90_noerr) THEN 217 abort_message=' Nudging error -> no file T.nc' 218 CALL abort_gcm(modname,abort_message,1) 219 endif 220 endif 221 222 212 IF (ncidpl==-99) THEN 213 rcod = nf90_open('T.nc', nf90_nowrite, ncidpl) 214 IF (rcod/=nf90_noerr) THEN 215 abort_message = ' Nudging error -> no file T.nc' 216 CALL abort_gcm(modname, abort_message, 1) 217 endif 218 endif 223 219 224 220 elseif (guide_Q) THEN 225 if (ncidpl==-99) THEN 226 rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl) 227 if (rcod/=nf90_noerr) THEN 228 abort_message=' Nudging error -> no file hur.nc' 229 CALL abort_gcm(modname,abort_message,1) 230 endif 231 endif 232 233 234 endif 235 error=nf90_inq_dimid(ncidpl,'LEVEL',rid) 236 IF (error/=nf90_noerr) error=nf90_inq_dimid(ncidpl,'PRESSURE',rid) 221 IF (ncidpl==-99) THEN 222 rcod = nf90_open('hur.nc', nf90_nowrite, ncidpl) 223 IF (rcod/=nf90_noerr) THEN 224 abort_message = ' Nudging error -> no file hur.nc' 225 CALL abort_gcm(modname, abort_message, 1) 226 endif 227 endif 228 229 endif 230 error = nf90_inq_dimid(ncidpl, 'LEVEL', rid) 231 IF (error/=nf90_noerr) error = nf90_inq_dimid(ncidpl, 'PRESSURE', rid) 237 232 IF (error/=nf90_noerr) THEN 238 abort_message='Nudging: error reading pressure levels'239 CALL abort_gcm(modname,abort_message,1)240 ENDIF 241 error =nf90_inquire_dimension(ncidpl,rid,len=nlevnc)242 WRITE(*, *)trim(modname)//' : number of vertical levels nlevnc', nlevnc233 abort_message = 'Nudging: error reading pressure levels' 234 CALL abort_gcm(modname, abort_message, 1) 235 ENDIF 236 error = nf90_inquire_dimension(ncidpl, rid, len = nlevnc) 237 WRITE(*, *)trim(modname) // ' : number of vertical levels nlevnc', nlevnc 243 238 rcod = nf90_close(ncidpl) 244 239 245 ! ---------------------------------------------246 ! Allocation des variables247 ! ---------------------------------------------248 abort_message ='nudging allocation error'240 ! --------------------------------------------- 241 ! Allocation des variables 242 ! --------------------------------------------- 243 abort_message = 'nudging allocation error' 249 244 250 245 ALLOCATE(apnc(nlevnc), stat = error) 251 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)246 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 252 247 ALLOCATE(bpnc(nlevnc), stat = error) 253 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)254 apnc =0.;bpnc=0.248 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 249 apnc = 0.;bpnc = 0. 255 250 256 251 ALLOCATE(alpha_pcor(llm), stat = error) 257 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)252 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 258 253 ALLOCATE(alpha_u(ijb_u:ije_u), stat = error) 259 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)254 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 260 255 ALLOCATE(alpha_v(ijb_v:ije_v), stat = error) 261 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)256 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 262 257 ALLOCATE(alpha_T(ijb_u:ije_u), stat = error) 263 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)258 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 264 259 ALLOCATE(alpha_Q(ijb_u:ije_u), stat = error) 265 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)260 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 266 261 ALLOCATE(alpha_P(ijb_u:ije_u), stat = error) 267 IF (error /= 0) CALL abort_gcm(modname, abort_message,1)268 alpha_u =0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0269 262 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 263 alpha_u = 0.;alpha_v = 0;alpha_T = 0;alpha_Q = 0;alpha_P = 0 264 270 265 IF (guide_u) THEN 271 ALLOCATE(unat1(iip1,jjb_u:jje_u,nlevnc), stat = error)272 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)273 ALLOCATE(ugui1(ijb_u:ije_u,llm), stat = error)274 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)275 ALLOCATE(unat2(iip1,jjb_u:jje_u,nlevnc), stat = error)276 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)277 ALLOCATE(ugui2(ijb_u:ije_u,llm), stat = error)278 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)279 unat1=0.;unat2=0.;ugui1=0.;ugui2=0.266 ALLOCATE(unat1(iip1, jjb_u:jje_u, nlevnc), stat = error) 267 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 268 ALLOCATE(ugui1(ijb_u:ije_u, llm), stat = error) 269 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 270 ALLOCATE(unat2(iip1, jjb_u:jje_u, nlevnc), stat = error) 271 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 272 ALLOCATE(ugui2(ijb_u:ije_u, llm), stat = error) 273 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 274 unat1 = 0.;unat2 = 0.;ugui1 = 0.;ugui2 = 0. 280 275 ENDIF 281 276 282 277 IF (guide_T) THEN 283 ALLOCATE(tnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)284 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)285 ALLOCATE(tgui1(ijb_u:ije_u,llm), stat = error)286 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)287 ALLOCATE(tnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)288 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)289 ALLOCATE(tgui2(ijb_u:ije_u,llm), stat = error)290 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)291 tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.292 ENDIF 293 278 ALLOCATE(tnat1(iip1, jjb_u:jje_u, nlevnc), stat = error) 279 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 280 ALLOCATE(tgui1(ijb_u:ije_u, llm), stat = error) 281 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 282 ALLOCATE(tnat2(iip1, jjb_u:jje_u, nlevnc), stat = error) 283 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 284 ALLOCATE(tgui2(ijb_u:ije_u, llm), stat = error) 285 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 286 tnat1 = 0.;tnat2 = 0.;tgui1 = 0.;tgui2 = 0. 287 ENDIF 288 294 289 IF (guide_Q) THEN 295 ALLOCATE(qnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)296 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)297 ALLOCATE(qgui1(ijb_u:ije_u,llm), stat = error)298 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)299 ALLOCATE(qnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)300 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)301 ALLOCATE(qgui2(ijb_u:ije_u,llm), stat = error)302 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)303 qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.290 ALLOCATE(qnat1(iip1, jjb_u:jje_u, nlevnc), stat = error) 291 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 292 ALLOCATE(qgui1(ijb_u:ije_u, llm), stat = error) 293 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 294 ALLOCATE(qnat2(iip1, jjb_u:jje_u, nlevnc), stat = error) 295 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 296 ALLOCATE(qgui2(ijb_u:ije_u, llm), stat = error) 297 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 298 qnat1 = 0.;qnat2 = 0.;qgui1 = 0.;qgui2 = 0. 304 299 ENDIF 305 300 306 301 IF (guide_v) THEN 307 ALLOCATE(vnat1(iip1,jjb_v:jje_v,nlevnc), stat = error)308 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)309 ALLOCATE(vgui1(ijb_v:ije_v,llm), stat = error)310 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)311 ALLOCATE(vnat2(iip1,jjb_v:jje_v,nlevnc), stat = error)312 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)313 ALLOCATE(vgui2(ijb_v:ije_v,llm), stat = error)314 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)315 vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.302 ALLOCATE(vnat1(iip1, jjb_v:jje_v, nlevnc), stat = error) 303 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 304 ALLOCATE(vgui1(ijb_v:ije_v, llm), stat = error) 305 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 306 ALLOCATE(vnat2(iip1, jjb_v:jje_v, nlevnc), stat = error) 307 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 308 ALLOCATE(vgui2(ijb_v:ije_v, llm), stat = error) 309 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 310 vnat1 = 0.;vnat2 = 0.;vgui1 = 0.;vgui2 = 0. 316 311 ENDIF 317 312 318 313 IF (guide_plevs==2) THEN 319 ALLOCATE(pnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)320 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)321 ALLOCATE(pnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)322 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)323 pnat1=0.;pnat2=0.;314 ALLOCATE(pnat1(iip1, jjb_u:jje_u, nlevnc), stat = error) 315 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 316 ALLOCATE(pnat2(iip1, jjb_u:jje_u, nlevnc), stat = error) 317 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 318 pnat1 = 0.;pnat2 = 0.; 324 319 ENDIF 325 320 326 321 IF (guide_P.OR.guide_plevs==1) THEN 327 ALLOCATE(psnat1(iip1,jjb_u:jje_u), stat = error)328 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)329 ALLOCATE(psnat2(iip1,jjb_u:jje_u), stat = error)330 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)331 psnat1=0.;psnat2=0.;322 ALLOCATE(psnat1(iip1, jjb_u:jje_u), stat = error) 323 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 324 ALLOCATE(psnat2(iip1, jjb_u:jje_u), stat = error) 325 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 326 psnat1 = 0.;psnat2 = 0.; 332 327 ENDIF 333 328 IF (guide_P) THEN 334 335 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)336 337 IF (error /= 0) CALL abort_gcm(modname,abort_message,1)338 psgui1=0.;psgui2=0.339 ENDIF 340 341 ! ---------------------------------------------342 ! Lecture du premier etat de guidage.343 ! ---------------------------------------------329 ALLOCATE(psgui2(ijb_u:ije_u), stat = error) 330 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 331 ALLOCATE(psgui1(ijb_u:ije_u), stat = error) 332 IF (error /= 0) CALL abort_gcm(modname, abort_message, 1) 333 psgui1 = 0.;psgui2 = 0. 334 ENDIF 335 336 ! --------------------------------------------- 337 ! Lecture du premier etat de guidage. 338 ! --------------------------------------------- 344 339 IF (guide_2D) THEN 345 340 CALL guide_read2D(1) 346 341 ELSE 347 348 ENDIF 349 IF (guide_v) vnat1 =vnat2350 IF (guide_u) unat1 =unat2351 IF (guide_T) tnat1 =tnat2352 IF (guide_Q) qnat1 =qnat2353 IF (guide_plevs==2) pnat1 =pnat2354 IF (guide_P.OR.guide_plevs==1) psnat1 =psnat2342 CALL guide_read(1) 343 ENDIF 344 IF (guide_v) vnat1 = vnat2 345 IF (guide_u) unat1 = unat2 346 IF (guide_T) tnat1 = tnat2 347 IF (guide_Q) qnat1 = qnat2 348 IF (guide_plevs==2) pnat1 = pnat2 349 IF (guide_P.OR.guide_plevs==1) psnat1 = psnat2 355 350 356 351 END SUBROUTINE guide_init 357 352 358 !=======================================================================359 SUBROUTINE guide_main(itau, ucov,vcov,teta,q,masse,ps)360 useexner_hyb_loc_m, ONLY: exner_hyb_loc361 useexner_milieu_loc_m, ONLY: exner_milieu_loc353 !======================================================================= 354 SUBROUTINE guide_main(itau, ucov, vcov, teta, q, masse, ps) 355 USE exner_hyb_loc_m, ONLY: exner_hyb_loc 356 USE exner_milieu_loc_m, ONLY: exner_milieu_loc 362 357 USE parallel_lmdz 363 358 USE control_mod … … 365 360 USE comconst_mod, ONLY: cpp, daysec, dtvr, kappa 366 361 USE comvert_mod, ONLY: ap, bp, preff, presnivs, pressure_exner 367 362 368 363 IMPLICIT NONE 369 364 370 365 INCLUDE "dimensions.h" 371 366 INCLUDE "paramet.h" 372 367 373 368 ! Variables entree 374 INTEGER, INTENT(IN):: itau !pas de temps375 REAL, DIMENSION (ijb_u:ije_u, llm), INTENT(INOUT) :: ucov,teta,q,masse376 REAL, DIMENSION (ijb_v:ije_v, llm), INTENT(INOUT) :: vcov377 REAL, DIMENSION (ijb_u:ije_u), 369 INTEGER, INTENT(IN) :: itau !pas de temps 370 REAL, DIMENSION (ijb_u:ije_u, llm), INTENT(INOUT) :: ucov, teta, q, masse 371 REAL, DIMENSION (ijb_v:ije_v, llm), INTENT(INOUT) :: vcov 372 REAL, DIMENSION (ijb_u:ije_u), INTENT(INOUT) :: ps 378 373 379 374 ! Variables locales 380 LOGICAL, SAVE :: first =.TRUE.381 !$OMP THREADPRIVATE(first)382 LOGICAL 383 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: f_addu ! var aux: champ de guidage384 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: f_addv ! var aux: champ de guidage375 LOGICAL, SAVE :: first = .TRUE. 376 !$OMP THREADPRIVATE(first) 377 LOGICAL :: f_out ! sortie guidage 378 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: f_addu ! var aux: champ de guidage 379 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: f_addv ! var aux: champ de guidage 385 380 ! Variables pour fonction Exner (P milieu couche) 386 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :,:):: pk387 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: pks388 REAL 389 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :):: p ! besoin si guide_P381 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: pk 382 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: pks 383 REAL :: unskap 384 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: p ! besoin si guide_P 390 385 ! Compteurs temps: 391 INTEGER, SAVE :: step_rea, count_no_rea,itau_test ! lecture guidage392 !$OMP THREADPRIVATE(step_rea,count_no_rea,itau_test)393 REAL 394 REAL :: tau,reste ! position entre 2 etats de guidage395 REAL, SAVE 396 !$OMP THREADPRIVATE(factt)397 398 INTEGER :: i,j,l399 CHARACTER(LEN =20) :: modname="guide_main"400 401 !$OMP MASTER 402 ijbu =ij_begin ; ijeu=ij_end403 jjbu =jj_begin ; jjeu=jj_end ; jjnu=jjeu-jjbu+1404 ijbv =ij_begin ; ijev=ij_end405 jjbv =jj_begin ; jjev=jj_end ; jjnv=jjev-jjbv+1386 INTEGER, SAVE :: step_rea, count_no_rea, itau_test ! lecture guidage 387 !$OMP THREADPRIVATE(step_rea,count_no_rea,itau_test) 388 REAL :: ditau, dday_step 389 REAL :: tau, reste ! position entre 2 etats de guidage 390 REAL, SAVE :: factt ! pas de temps en fraction de jour 391 !$OMP THREADPRIVATE(factt) 392 393 INTEGER :: i, j, l 394 CHARACTER(LEN = 20) :: modname = "guide_main" 395 396 !$OMP MASTER 397 ijbu = ij_begin ; ijeu = ij_end 398 jjbu = jj_begin ; jjeu = jj_end ; jjnu = jjeu - jjbu + 1 399 ijbv = ij_begin ; ijev = ij_end 400 jjbv = jj_begin ; jjev = jj_end ; jjnv = jjev - jjbv + 1 406 401 IF (pole_sud) THEN 407 ijeu =ij_end-iip1408 ijev =ij_end-iip1409 jjev =jj_end-1410 jjnv =jjev-jjbv+1402 ijeu = ij_end - iip1 403 ijev = ij_end - iip1 404 jjev = jj_end - 1 405 jjnv = jjev - jjbv + 1 411 406 ENDIF 412 407 IF (pole_nord) THEN 413 ijbu =ij_begin+iip1414 ijbv =ij_begin415 ENDIF 416 !$OMP END MASTER417 !$OMP BARRIER418 419 ! PRINT *,'---> on rentre dans guide_main'420 ! CALL AllGather_Field(ucov,ip1jmp1,llm)421 ! CALL AllGather_Field(vcov,ip1jm,llm)422 ! CALL AllGather_Field(teta,ip1jmp1,llm)423 ! CALL AllGather_Field(ps,ip1jmp1,1)424 ! CALL AllGather_Field(q,ip1jmp1,llm)425 426 !-----------------------------------------------------------------------427 ! Initialisations au premier passage428 !-----------------------------------------------------------------------408 ijbu = ij_begin + iip1 409 ijbv = ij_begin 410 ENDIF 411 !$OMP END MASTER 412 !$OMP BARRIER 413 414 ! PRINT *,'---> on rentre dans guide_main' 415 ! CALL AllGather_Field(ucov,ip1jmp1,llm) 416 ! CALL AllGather_Field(vcov,ip1jm,llm) 417 ! CALL AllGather_Field(teta,ip1jmp1,llm) 418 ! CALL AllGather_Field(ps,ip1jmp1,1) 419 ! CALL AllGather_Field(q,ip1jmp1,llm) 420 421 !----------------------------------------------------------------------- 422 ! Initialisations au premier passage 423 !----------------------------------------------------------------------- 429 424 430 425 IF (first) THEN 431 first=.FALSE.432 !$OMP MASTER433 ALLOCATE(f_addu(ijb_u:ije_u,llm) )434 ALLOCATE(f_addv(ijb_v:ije_v,llm) )435 ALLOCATE(pk(iip1,jjb_u:jje_u,llm) )436 ALLOCATE(pks(iip1,jjb_u:jje_u) )437 ALLOCATE(p(ijb_u:ije_u,llmp1) )438 CALL guide_init439 !$OMP END MASTER440 !$OMP BARRIER441 itau_test=1001442 step_rea=1443 count_no_rea=0444 ! Calcul des constantes de rappel445 factt=dtvr*iperiod/daysec446 !$OMP MASTER447 448 449 450 451 452 ! correction de rappel dans couche limite453 if(guide_BL) THEN454 alpha_pcor(:)=1.455 456 do l=1,llm457 alpha_pcor(l)=(1.+tanh(((plim_guide_BL-presnivs(l))/preff)/0.05))/2.458 459 460 !$OMP END MASTER461 !$OMP BARRIER462 ! ini_anal: etat initial egal au guidage 463 464 CALL guide_interp(ps,teta)465 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 466 DO l=1,llm467 IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l)468 IF (guide_v) vcov(ijbv:ijev,l)=ugui2(ijbv:ijev,l)469 IF (guide_T) teta(ijbu:ijeu,l)=tgui2(ijbu:ijeu,l)470 IF (guide_Q) q(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)471 472 473 474 !$OMP MASTER475 ps(ijbu:ijeu)=psgui2(ijbu:ijeu)476 !$OMP END MASTER477 !$OMP BARRIER478 CALL pression_loc(ijnb_u,ap,bp,ps,p)479 CALL massdair_loc(p,masse)480 !$OMP BARRIER481 482 483 426 first = .FALSE. 427 !$OMP MASTER 428 ALLOCATE(f_addu(ijb_u:ije_u, llm)) 429 ALLOCATE(f_addv(ijb_v:ije_v, llm)) 430 ALLOCATE(pk(iip1, jjb_u:jje_u, llm)) 431 ALLOCATE(pks(iip1, jjb_u:jje_u)) 432 ALLOCATE(p(ijb_u:ije_u, llmp1)) 433 CALL guide_init 434 !$OMP END MASTER 435 !$OMP BARRIER 436 itau_test = 1001 437 step_rea = 1 438 count_no_rea = 0 439 ! Calcul des constantes de rappel 440 factt = dtvr * iperiod / daysec 441 !$OMP MASTER 442 CALL tau2alpha(3, iip1, jjb_v, jje_v, factt, tau_min_v, tau_max_v, alpha_v) 443 CALL tau2alpha(2, iip1, jjb_u, jje_u, factt, tau_min_u, tau_max_u, alpha_u) 444 CALL tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_T, tau_max_T, alpha_T) 445 CALL tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_P, tau_max_P, alpha_P) 446 CALL tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_Q, tau_max_Q, alpha_Q) 447 ! correction de rappel dans couche limite 448 IF (guide_BL) THEN 449 alpha_pcor(:) = 1. 450 else 451 do l = 1, llm 452 alpha_pcor(l) = (1. + tanh(((plim_guide_BL - presnivs(l)) / preff) / 0.05)) / 2. 453 enddo 454 endif 455 !$OMP END MASTER 456 !$OMP BARRIER 457 ! ini_anal: etat initial egal au guidage 458 IF (ini_anal) THEN 459 CALL guide_interp(ps, teta) 460 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 461 DO l = 1, llm 462 IF (guide_u) ucov(ijbu:ijeu, l) = ugui2(ijbu:ijeu, l) 463 IF (guide_v) vcov(ijbv:ijev, l) = ugui2(ijbv:ijev, l) 464 IF (guide_T) teta(ijbu:ijeu, l) = tgui2(ijbu:ijeu, l) 465 IF (guide_Q) q(ijbu:ijeu, l) = qgui2(ijbu:ijeu, l) 466 ENDDO 467 468 IF (guide_P) THEN 469 !$OMP MASTER 470 ps(ijbu:ijeu) = psgui2(ijbu:ijeu) 471 !$OMP END MASTER 472 !$OMP BARRIER 473 CALL pression_loc(ijnb_u, ap, bp, ps, p) 474 CALL massdair_loc(p, masse) 475 !$OMP BARRIER 476 ENDIF 477 RETURN 478 ENDIF 484 479 485 480 ENDIF !first 486 481 487 !-----------------------------------------------------------------------488 ! Lecture des fichiers de guidage ?489 !-----------------------------------------------------------------------482 !----------------------------------------------------------------------- 483 ! Lecture des fichiers de guidage ? 484 !----------------------------------------------------------------------- 490 485 IF (iguide_read/=0) THEN 491 ditau =real(itau)492 dday_step =real(day_step)486 ditau = real(itau) 487 dday_step = real(day_step) 493 488 IF (iguide_read<0) THEN 494 tau=ditau/dday_step/REAL(iguide_read)489 tau = ditau / dday_step / REAL(iguide_read) 495 490 ELSE 496 tau=REAL(iguide_read)*ditau/dday_step497 ENDIF 498 reste =tau-AINT(tau)491 tau = REAL(iguide_read) * ditau / dday_step 492 ENDIF 493 reste = tau - AINT(tau) 499 494 IF (reste==0.) THEN 500 IF (itau_test==itau) THEN 501 WRITE(*,*)trim(modname)//' second pass in advreel at itau=',& 502 itau 503 CALL abort_gcm("guide_loc_lod","stopped",1) 495 IF (itau_test==itau) THEN 496 WRITE(*, *)trim(modname) // ' second pass in advreel at itau=', & 497 itau 498 CALL abort_gcm("guide_loc_lod", "stopped", 1) 499 ELSE 500 !$OMP MASTER 501 IF (guide_v) vnat1(:, jjbv:jjev, :) = vnat2(:, jjbv:jjev, :) 502 IF (guide_u) unat1(:, jjbu:jjeu, :) = unat2(:, jjbu:jjeu, :) 503 IF (guide_T) tnat1(:, jjbu:jjeu, :) = tnat2(:, jjbu:jjeu, :) 504 IF (guide_Q) qnat1(:, jjbu:jjeu, :) = qnat2(:, jjbu:jjeu, :) 505 IF (guide_plevs==2) pnat1(:, jjbu:jjeu, :) = pnat2(:, jjbu:jjeu, :) 506 IF (guide_P.OR.guide_plevs==1) psnat1(:, jjbu:jjeu) = psnat2(:, jjbu:jjeu) 507 !$OMP END MASTER 508 !$OMP BARRIER 509 step_rea = step_rea + 1 510 itau_test = itau 511 IF (is_master) THEN 512 WRITE(*, *)trim(modname) // ' Reading nudging files, step ', & 513 step_rea, 'after ', count_no_rea, ' skips' 514 endif 515 IF (guide_2D) THEN 516 !$OMP MASTER 517 CALL guide_read2D(step_rea) 518 !$OMP END MASTER 519 !$OMP BARRIER 504 520 ELSE 505 !$OMP MASTER 506 IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:) 507 IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:) 508 IF (guide_T) tnat1(:,jjbu:jjeu,:)=tnat2(:,jjbu:jjeu,:) 509 IF (guide_Q) qnat1(:,jjbu:jjeu,:)=qnat2(:,jjbu:jjeu,:) 510 IF (guide_plevs==2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:) 511 IF (guide_P.OR.guide_plevs==1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu) 512 !$OMP END MASTER 513 !$OMP BARRIER 514 step_rea=step_rea+1 515 itau_test=itau 516 if (is_master) THEN 517 WRITE(*,*)trim(modname)//' Reading nudging files, step ',& 518 step_rea,'after ',count_no_rea,' skips' 519 endif 520 IF (guide_2D) THEN 521 !$OMP MASTER 522 CALL guide_read2D(step_rea) 523 !$OMP END MASTER 524 !$OMP BARRIER 525 ELSE 526 !$OMP MASTER 527 CALL guide_read(step_rea) 528 !$OMP END MASTER 529 !$OMP BARRIER 530 ENDIF 531 count_no_rea=0 521 !$OMP MASTER 522 CALL guide_read(step_rea) 523 !$OMP END MASTER 524 !$OMP BARRIER 532 525 ENDIF 526 count_no_rea = 0 527 ENDIF 533 528 ELSE 534 count_no_rea =count_no_rea+1529 count_no_rea = count_no_rea + 1 535 530 536 531 ENDIF 537 532 ENDIF !iguide_read=0 538 533 539 !-----------------------------------------------------------------------540 ! Interpolation et conversion des champs de guidage541 !-----------------------------------------------------------------------542 IF (MOD(itau, iguide_int)==0) THEN543 CALL guide_interp(ps,teta)544 ENDIF 545 ! Repartition entre 2 etats de guidage534 !----------------------------------------------------------------------- 535 ! Interpolation et conversion des champs de guidage 536 !----------------------------------------------------------------------- 537 IF (MOD(itau, iguide_int)==0) THEN 538 CALL guide_interp(ps, teta) 539 ENDIF 540 ! Repartition entre 2 etats de guidage 546 541 IF (iguide_read/=0) THEN 547 tau=reste542 tau = reste 548 543 ELSE 549 tau=1.550 ENDIF 551 552 ! CALL WriteField_u('ucov_guide',ucov)553 ! CALL WriteField_v('vcov_guide',vcov)554 ! CALL WriteField_u('teta_guide',teta)555 ! CALL WriteField_u('masse_guide',masse)556 557 558 !-----------------------------------------------------------------------559 ! Ajout des champs de guidage 560 !-----------------------------------------------------------------------561 ! Sauvegarde du guidage?562 f_out =((MOD(itau,iguide_sav)==0).AND.guide_sav)544 tau = 1. 545 ENDIF 546 547 ! CALL WriteField_u('ucov_guide',ucov) 548 ! CALL WriteField_v('vcov_guide',vcov) 549 ! CALL WriteField_u('teta_guide',teta) 550 ! CALL WriteField_u('masse_guide',masse) 551 552 553 !----------------------------------------------------------------------- 554 ! Ajout des champs de guidage 555 !----------------------------------------------------------------------- 556 ! Sauvegarde du guidage? 557 f_out = ((MOD(itau, iguide_sav)==0).AND.guide_sav) 563 558 IF (f_out) THEN 564 559 565 !$OMP BARRIER566 CALL pression_loc(ijnb_u, ap,bp,ps,p)567 568 !$OMP BARRIER569 if(pressure_exner) THEN570 CALL exner_hyb_loc(ijnb_u, ps, p, pks, pk)560 !$OMP BARRIER 561 CALL pression_loc(ijnb_u, ap, bp, ps, p) 562 563 !$OMP BARRIER 564 IF (pressure_exner) THEN 565 CALL exner_hyb_loc(ijnb_u, ps, p, pks, pk) 571 566 else 572 CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk ) 573 endif 574 575 !$OMP BARRIER 576 577 unskap=1./kappa 578 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 567 CALL exner_milieu_loc(ijnb_u, ps, p, pks, pk) 568 endif 569 570 !$OMP BARRIER 571 572 unskap = 1. / kappa 573 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 574 DO l = 1, llm 575 DO j = jjbu, jjeu 576 DO i = 1, iip1 577 p(i + (j - 1) * iip1, l) = preff * (pk(i, j, l) / cpp) ** unskap 578 ENDDO 579 ENDDO 580 ENDDO 581 582 CALL guide_out("SP", jjp1, llm, p(ijb_u:ije_u, 1:llm), 1.) 583 ENDIF 584 585 IF (guide_u) THEN 586 IF (guide_add) THEN 587 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 579 588 DO l = 1, llm 580 DO j=jjbu,jjeu 581 DO i =1, iip1 582 p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap 583 ENDDO 584 ENDDO 585 ENDDO 586 587 CALL guide_out("SP",jjp1,llm,p(ijb_u:ije_u,1:llm),1.) 588 ENDIF 589 590 if (guide_u) THEN 591 if (guide_add) THEN 592 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 593 DO l=1,llm 594 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l) 595 ENDDO 596 else 597 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 598 DO l=1,llm 599 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l) 600 ENDDO 601 endif 602 603 ! CALL WriteField_u('f_addu',f_addu) 604 605 if (guide_zon) CALL guide_zonave_u(1,llm,f_addu) 606 CALL guide_addfield_u(llm,f_addu,alpha_u) 607 IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:),factt) 608 IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt) 609 IF (f_out) THEN 610 ! Ehouarn: fill the gaps adequately... 611 IF (ijbu>ijb_u) f_addu(ijb_u:ijbu-1,:)=0 612 IF (ijeu<ije_u) f_addu(ijeu+1:ije_u,:)=0 613 CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:)/factt,factt) 614 ENDIF 615 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 616 DO l=1,llm 617 ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) 618 ENDDO 589 f_addu(ijbu:ijeu, l) = (1. - tau) * ugui1(ijbu:ijeu, l) + tau * ugui2(ijbu:ijeu, l) 590 ENDDO 591 else 592 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 593 DO l = 1, llm 594 f_addu(ijbu:ijeu, l) = (1. - tau) * ugui1(ijbu:ijeu, l) + tau * ugui2(ijbu:ijeu, l) - ucov(ijbu:ijeu, l) 595 ENDDO 596 endif 597 598 ! CALL WriteField_u('f_addu',f_addu) 599 600 IF (guide_zon) CALL guide_zonave_u(1, llm, f_addu) 601 CALL guide_addfield_u(llm, f_addu, alpha_u) 602 IF (f_out) CALL guide_out("ua", jjp1, llm, (1. - tau) * ugui1(ijb_u:ije_u, :) + tau * ugui2(ijb_u:ije_u, :), factt) 603 IF (f_out) CALL guide_out("u", jjp1, llm, ucov(ijb_u:ije_u, :), factt) 604 IF (f_out) THEN 605 ! Ehouarn: fill the gaps adequately... 606 IF (ijbu>ijb_u) f_addu(ijb_u:ijbu - 1, :) = 0 607 IF (ijeu<ije_u) f_addu(ijeu + 1:ije_u, :) = 0 608 CALL guide_out("ucov", jjp1, llm, f_addu(ijb_u:ije_u, :) / factt, factt) 609 ENDIF 610 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 611 DO l = 1, llm 612 ucov(ijbu:ijeu, l) = ucov(ijbu:ijeu, l) + f_addu(ijbu:ijeu, l) 613 ENDDO 619 614 620 615 endif 621 616 622 if(guide_T) THEN623 if(guide_add) THEN624 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)625 DO l=1,llm626 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)627 628 629 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)630 DO l=1,llm631 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l)632 633 endif634 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)635 CALL guide_addfield_u(llm,f_addu,alpha_T)636 IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt)637 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)638 DO l=1,llm639 teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)640 617 IF (guide_T) THEN 618 IF (guide_add) THEN 619 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 620 DO l = 1, llm 621 f_addu(ijbu:ijeu, l) = (1. - tau) * tgui1(ijbu:ijeu, l) + tau * tgui2(ijbu:ijeu, l) 622 ENDDO 623 else 624 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 625 DO l = 1, llm 626 f_addu(ijbu:ijeu, l) = (1. - tau) * tgui1(ijbu:ijeu, l) + tau * tgui2(ijbu:ijeu, l) - teta(ijbu:ijeu, l) 627 ENDDO 628 endif 629 IF (guide_zon) CALL guide_zonave_u(2, llm, f_addu) 630 CALL guide_addfield_u(llm, f_addu, alpha_T) 631 IF (f_out) CALL guide_out("teta", jjp1, llm, f_addu(:, :) / factt, factt) 632 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 633 DO l = 1, llm 634 teta(ijbu:ijeu, l) = teta(ijbu:ijeu, l) + f_addu(ijbu:ijeu, l) 635 ENDDO 641 636 endif 642 637 643 if(guide_P) THEN644 if(guide_add) THEN645 !$OMP MASTER646 f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)647 !$OMP END MASTER648 !$OMP BARRIER649 650 !$OMP MASTER651 f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu)652 !$OMP END MASTER653 !$OMP BARRIER654 endif655 if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1))656 CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P)657 ! IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt)658 !$OMP MASTER659 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1)660 !$OMP END MASTER661 !$OMP BARRIER662 CALL pression_loc(ijnb_u,ap,bp,ps,p)663 CALL massdair_loc(p,masse)664 !$OMP BARRIER638 IF (guide_P) THEN 639 IF (guide_add) THEN 640 !$OMP MASTER 641 f_addu(ijbu:ijeu, 1) = (1. - tau) * psgui1(ijbu:ijeu) + tau * psgui2(ijbu:ijeu) 642 !$OMP END MASTER 643 !$OMP BARRIER 644 else 645 !$OMP MASTER 646 f_addu(ijbu:ijeu, 1) = (1. - tau) * psgui1(ijbu:ijeu) + tau * psgui2(ijbu:ijeu) - ps(ijbu:ijeu) 647 !$OMP END MASTER 648 !$OMP BARRIER 649 endif 650 IF (guide_zon) CALL guide_zonave_u(2, 1, f_addu(ijb_u:ije_u, 1)) 651 CALL guide_addfield_u(1, f_addu(ijb_u:ije_u, 1), alpha_P) 652 ! IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt) 653 !$OMP MASTER 654 ps(ijbu:ijeu) = ps(ijbu:ijeu) + f_addu(ijbu:ijeu, 1) 655 !$OMP END MASTER 656 !$OMP BARRIER 657 CALL pression_loc(ijnb_u, ap, bp, ps, p) 658 CALL massdair_loc(p, masse) 659 !$OMP BARRIER 665 660 endif 666 661 667 if(guide_Q) THEN668 if(guide_add) THEN669 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)670 DO l=1,llm671 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)672 673 674 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)675 DO l=1,llm676 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l)677 678 endif679 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)680 CALL guide_addfield_u(llm,f_addu,alpha_Q)681 IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt)682 683 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)684 DO l=1,llm685 q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)686 662 IF (guide_Q) THEN 663 IF (guide_add) THEN 664 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 665 DO l = 1, llm 666 f_addu(ijbu:ijeu, l) = (1. - tau) * qgui1(ijbu:ijeu, l) + tau * qgui2(ijbu:ijeu, l) 667 ENDDO 668 else 669 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 670 DO l = 1, llm 671 f_addu(ijbu:ijeu, l) = (1. - tau) * qgui1(ijbu:ijeu, l) + tau * qgui2(ijbu:ijeu, l) - q(ijbu:ijeu, l) 672 ENDDO 673 endif 674 IF (guide_zon) CALL guide_zonave_u(2, llm, f_addu) 675 CALL guide_addfield_u(llm, f_addu, alpha_Q) 676 IF (f_out) CALL guide_out("q", jjp1, llm, f_addu(:, :) / factt, factt) 677 678 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 679 DO l = 1, llm 680 q(ijbu:ijeu, l) = q(ijbu:ijeu, l) + f_addu(ijbu:ijeu, l) 681 ENDDO 687 682 endif 688 683 689 if(guide_v) THEN690 if(guide_add) THEN691 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)692 DO l=1,llm693 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)694 695 696 697 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)698 DO l=1,llm699 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l)700 701 702 endif703 704 if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:))705 706 CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v)707 IF (f_out) CALL guide_out("v",jjm,llm,vcov(ijb_v:ije_v,:),factt)708 IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:),factt)709 710 711 IF (ijbv>ijb_v) f_addv(ijb_v:ijbv-1,:)=0712 IF (ijev<ije_v) f_addv(ijev+1:ije_v,:)=0713 CALL guide_out("vcov",jjm,llm,f_addv(ijb_v:ije_v,:)/factt,factt)714 715 716 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)717 DO l=1,llm718 vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l)719 684 IF (guide_v) THEN 685 IF (guide_add) THEN 686 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 687 DO l = 1, llm 688 f_addv(ijbv:ijev, l) = (1. - tau) * vgui1(ijbv:ijev, l) + tau * vgui2(ijbv:ijev, l) 689 ENDDO 690 691 else 692 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 693 DO l = 1, llm 694 f_addv(ijbv:ijev, l) = (1. - tau) * vgui1(ijbv:ijev, l) + tau * vgui2(ijbv:ijev, l) - vcov(ijbv:ijev, l) 695 ENDDO 696 697 endif 698 699 IF (guide_zon) CALL guide_zonave_v(2, jjm, llm, f_addv(ijb_v:ije_v, :)) 700 701 CALL guide_addfield_v(llm, f_addv(ijb_v:ije_v, :), alpha_v) 702 IF (f_out) CALL guide_out("v", jjm, llm, vcov(ijb_v:ije_v, :), factt) 703 IF (f_out) CALL guide_out("va", jjm, llm, (1. - tau) * vgui1(ijb_v:ije_v, :) + tau * vgui2(ijb_v:ije_v, :), factt) 704 IF (f_out) THEN 705 ! Ehouarn: Fill in the gaps adequately 706 IF (ijbv>ijb_v) f_addv(ijb_v:ijbv - 1, :) = 0 707 IF (ijev<ije_v) f_addv(ijev + 1:ije_v, :) = 0 708 CALL guide_out("vcov", jjm, llm, f_addv(ijb_v:ije_v, :) / factt, factt) 709 ENDIF 710 711 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 712 DO l = 1, llm 713 vcov(ijbv:ijev, l) = vcov(ijbv:ijev, l) + f_addv(ijbv:ijev, l) 714 ENDDO 720 715 endif 721 716 … … 723 718 724 719 725 SUBROUTINE guide_addfield_u(vsize, field,alpha)726 ! field1=a*field1+alpha*field2720 SUBROUTINE guide_addfield_u(vsize, field, alpha) 721 ! field1=a*field1+alpha*field2 727 722 728 723 IMPLICIT NONE … … 731 726 732 727 ! input variables 733 INTEGER, INTENT(IN):: vsize734 REAL, DIMENSION(ijb_u:ije_u), INTENT(IN) :: alpha735 REAL, DIMENSION(ijb_u:ije_u, vsize), INTENT(INOUT) :: field728 INTEGER, INTENT(IN) :: vsize 729 REAL, DIMENSION(ijb_u:ije_u), INTENT(IN) :: alpha 730 REAL, DIMENSION(ijb_u:ije_u, vsize), INTENT(INOUT) :: field 736 731 737 732 ! Local variables 738 733 INTEGER :: l 739 734 740 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)741 DO l =1,vsize742 field(ijbu:ijeu, l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l)735 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 736 DO l = 1, vsize 737 field(ijbu:ijeu, l) = alpha(ijbu:ijeu) * field(ijbu:ijeu, l) * alpha_pcor(l) 743 738 ENDDO 744 739 … … 746 741 747 742 748 SUBROUTINE guide_addfield_v(vsize, field,alpha)749 ! field1=a*field1+alpha*field2743 SUBROUTINE guide_addfield_v(vsize, field, alpha) 744 ! field1=a*field1+alpha*field2 750 745 751 746 IMPLICIT NONE … … 754 749 755 750 ! input variables 756 INTEGER, INTENT(IN):: vsize757 REAL, DIMENSION(ijb_v:ije_v), INTENT(IN) :: alpha758 REAL, DIMENSION(ijb_v:ije_v, vsize), INTENT(INOUT) :: field751 INTEGER, INTENT(IN) :: vsize 752 REAL, DIMENSION(ijb_v:ije_v), INTENT(IN) :: alpha 753 REAL, DIMENSION(ijb_v:ije_v, vsize), INTENT(INOUT) :: field 759 754 760 755 ! Local variables 761 756 INTEGER :: l 762 757 763 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)764 DO l =1,vsize765 field(ijbv:ijev, l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l)758 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 759 DO l = 1, vsize 760 field(ijbv:ijev, l) = alpha(ijbv:ijev) * field(ijbv:ijev, l) * alpha_pcor(l) 766 761 ENDDO 767 762 768 763 END SUBROUTINE guide_addfield_v 769 770 !=======================================================================771 772 SUBROUTINE guide_zonave_u(typ, vsize,field)764 765 !======================================================================= 766 767 SUBROUTINE guide_zonave_u(typ, vsize, field) 773 768 774 769 USE comconst_mod, ONLY: pi 775 770 776 771 IMPLICIT NONE 777 772 … … 779 774 INCLUDE "paramet.h" 780 775 INCLUDE "comgeom.h" 781 776 782 777 ! input/output variables 783 INTEGER, INTENT(IN):: typ784 INTEGER, INTENT(IN):: vsize785 REAL, DIMENSION(ijb_u:ije_u, vsize), INTENT(INOUT) :: field778 INTEGER, INTENT(IN) :: typ 779 INTEGER, INTENT(IN) :: vsize 780 REAL, DIMENSION(ijb_u:ije_u, vsize), INTENT(INOUT) :: field 786 781 787 782 ! Local variables 788 LOGICAL, SAVE :: first=.TRUE.789 !$OMP THREADPRIVATE(first)783 LOGICAL, SAVE :: first = .TRUE. 784 !$OMP THREADPRIVATE(first) 790 785 791 786 INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain 792 !$OMP THREADPRIVATE(imin,imax) 793 INTEGER :: i,j,l,ij794 REAL, DIMENSION (iip1) 795 REAL, DIMENSION (jjb_u:jje_u, vsize):: fieldm ! zon-averaged field787 !$OMP THREADPRIVATE(imin,imax) 788 INTEGER :: i, j, l, ij 789 REAL, DIMENSION (iip1) :: lond ! longitude in Deg. 790 REAL, DIMENSION (jjb_u:jje_u, vsize) :: fieldm ! zon-averaged field 796 791 797 792 IF (first) THEN 798 first=.FALSE.799 !Compute domain for averaging800 lond=rlonu*180./pi801 imin(1)=1;imax(1)=iip1;802 imin(2)=1;imax(2)=iip1;803 804 DO i=1,iim805 IF (lond(i)<lon_min_g) imin(1)=i806 IF (lond(i)<=lon_max_g) imax(1)=i807 808 lond=rlonv*180./pi809 DO i=1,iim810 IF (lond(i)<lon_min_g) imin(2)=i811 IF (lond(i)<=lon_max_g) imax(2)=i812 813 814 ENDIF 815 816 817 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)818 DO l=1,vsize819 fieldm(:,l)=0.793 first = .FALSE. 794 !Compute domain for averaging 795 lond = rlonu * 180. / pi 796 imin(1) = 1;imax(1) = iip1; 797 imin(2) = 1;imax(2) = iip1; 798 IF (guide_reg) THEN 799 DO i = 1, iim 800 IF (lond(i)<lon_min_g) imin(1) = i 801 IF (lond(i)<=lon_max_g) imax(1) = i 802 ENDDO 803 lond = rlonv * 180. / pi 804 DO i = 1, iim 805 IF (lond(i)<lon_min_g) imin(2) = i 806 IF (lond(i)<=lon_max_g) imax(2) = i 807 ENDDO 808 ENDIF 809 ENDIF 810 811 812 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 813 DO l = 1, vsize 814 fieldm(:, l) = 0. 820 815 ! Compute zonal average 821 816 822 !correction bug ici 823 ! ---> a verifier 824 ! ym DO j=jjbv,jjev 825 DO j=jjbu,jjeu 826 DO i=imin(typ),imax(typ) 827 ij=(j-1)*iip1+i 828 fieldm(j,l)=fieldm(j,l)+field(ij,l) 829 ENDDO 830 ENDDO 831 fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1) 832 ! Compute forcing 833 DO j=jjbu,jjeu 834 DO i=1,iip1 835 ij=(j-1)*iip1+i 836 field(ij,l)=fieldm(j,l) 837 ENDDO 838 ENDDO 817 !correction bug ici 818 ! ---> a verifier 819 ! ym DO j=jjbv,jjev 820 DO j = jjbu, jjeu 821 DO i = imin(typ), imax(typ) 822 ij = (j - 1) * iip1 + i 823 fieldm(j, l) = fieldm(j, l) + field(ij, l) 824 ENDDO 839 825 ENDDO 826 fieldm(:, l) = fieldm(:, l) / REAL(imax(typ) - imin(typ) + 1) 827 ! Compute forcing 828 DO j = jjbu, jjeu 829 DO i = 1, iip1 830 ij = (j - 1) * iip1 + i 831 field(ij, l) = fieldm(j, l) 832 ENDDO 833 ENDDO 834 ENDDO 840 835 841 836 END SUBROUTINE guide_zonave_u 842 837 843 838 844 SUBROUTINE guide_zonave_v(typ, hsize,vsize,field)839 SUBROUTINE guide_zonave_v(typ, hsize, vsize, field) 845 840 846 841 USE comconst_mod, ONLY: pi 847 842 848 843 IMPLICIT NONE 849 844 … … 851 846 INCLUDE "paramet.h" 852 847 INCLUDE "comgeom.h" 853 848 854 849 ! input/output variables 855 INTEGER, INTENT(IN):: typ856 INTEGER, INTENT(IN):: vsize857 INTEGER, INTENT(IN):: hsize858 REAL, DIMENSION(ijb_v:ije_v, vsize), INTENT(INOUT) :: field850 INTEGER, INTENT(IN) :: typ 851 INTEGER, INTENT(IN) :: vsize 852 INTEGER, INTENT(IN) :: hsize 853 REAL, DIMENSION(ijb_v:ije_v, vsize), INTENT(INOUT) :: field 859 854 860 855 ! Local variables 861 LOGICAL, SAVE :: first=.TRUE.862 !$OMP THREADPRIVATE(first)856 LOGICAL, SAVE :: first = .TRUE. 857 !$OMP THREADPRIVATE(first) 863 858 INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain 864 !$OMP THREADPRIVATE(imin, imax)865 INTEGER :: i,j,l,ij866 REAL, DIMENSION (iip1) 867 REAL, DIMENSION (jjb_v:jjev, vsize):: fieldm ! zon-averaged field859 !$OMP THREADPRIVATE(imin, imax) 860 INTEGER :: i, j, l, ij 861 REAL, DIMENSION (iip1) :: lond ! longitude in Deg. 862 REAL, DIMENSION (jjb_v:jjev, vsize) :: fieldm ! zon-averaged field 868 863 869 864 IF (first) THEN 870 first=.FALSE.871 !Compute domain for averaging872 lond=rlonu*180./pi873 imin(1)=1;imax(1)=iip1;874 imin(2)=1;imax(2)=iip1;875 876 DO i=1,iim877 IF (lond(i)<lon_min_g) imin(1)=i878 IF (lond(i)<=lon_max_g) imax(1)=i879 880 lond=rlonv*180./pi881 DO i=1,iim882 IF (lond(i)<lon_min_g) imin(2)=i883 IF (lond(i)<=lon_max_g) imax(2)=i884 885 886 ENDIF 887 888 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)889 DO l=1,vsize865 first = .FALSE. 866 !Compute domain for averaging 867 lond = rlonu * 180. / pi 868 imin(1) = 1;imax(1) = iip1; 869 imin(2) = 1;imax(2) = iip1; 870 IF (guide_reg) THEN 871 DO i = 1, iim 872 IF (lond(i)<lon_min_g) imin(1) = i 873 IF (lond(i)<=lon_max_g) imax(1) = i 874 ENDDO 875 lond = rlonv * 180. / pi 876 DO i = 1, iim 877 IF (lond(i)<lon_min_g) imin(2) = i 878 IF (lond(i)<=lon_max_g) imax(2) = i 879 ENDDO 880 ENDIF 881 ENDIF 882 883 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 884 DO l = 1, vsize 890 885 ! Compute zonal average 891 fieldm(:,l)=0. 892 DO j=jjbv,jjev 893 DO i=imin(typ),imax(typ) 894 ij=(j-1)*iip1+i 895 fieldm(j,l)=fieldm(j,l)+field(ij,l) 896 ENDDO 897 ENDDO 898 fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1) 899 ! Compute forcing 900 DO j=jjbv,jjev 901 DO i=1,iip1 902 ij=(j-1)*iip1+i 903 field(ij,l)=fieldm(j,l) 904 ENDDO 905 ENDDO 886 fieldm(:, l) = 0. 887 DO j = jjbv, jjev 888 DO i = imin(typ), imax(typ) 889 ij = (j - 1) * iip1 + i 890 fieldm(j, l) = fieldm(j, l) + field(ij, l) 891 ENDDO 906 892 ENDDO 907 893 fieldm(:, l) = fieldm(:, l) / REAL(imax(typ) - imin(typ) + 1) 894 ! Compute forcing 895 DO j = jjbv, jjev 896 DO i = 1, iip1 897 ij = (j - 1) * iip1 + i 898 field(ij, l) = fieldm(j, l) 899 ENDDO 900 ENDDO 901 ENDDO 908 902 909 903 END SUBROUTINE guide_zonave_v 910 911 !======================================================================= 912 SUBROUTINE guide_interp(psi,teta) 913 use exner_hyb_loc_m, ONLY: exner_hyb_loc 914 use exner_milieu_loc_m, ONLY: exner_milieu_loc 915 USE parallel_lmdz 916 USE mod_hallo 917 USE Bands 918 USE comconst_mod, ONLY: cpp, kappa 919 USE comvert_mod, ONLY: preff, pressure_exner, bp, ap, disvert_type 920 IMPLICIT NONE 921 922 include "dimensions.h" 923 include "paramet.h" 924 include "comgeom2.h" 925 926 REAL, DIMENSION (iip1,jjb_u:jje_u), INTENT(IN) :: psi ! Psol gcm 927 REAL, DIMENSION (iip1,jjb_u:jje_u,llm), INTENT(IN) :: teta ! Temp. Pot. gcm 928 929 LOGICAL, SAVE :: first=.TRUE. 930 !$OMP THREADPRIVATE(first) 931 ! Variables pour niveaux pression: 932 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: plnc1,plnc2 !niveaux pression guidage 933 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: plunc,plsnc !niveaux pression modele 934 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: plvnc !niveaux pression modele 935 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: p ! pression intercouches 936 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pls, pext ! var intermediaire 937 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pbarx 938 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pbary 939 ! Variables pour fonction Exner (P milieu couche) 940 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pk 941 REAL ,ALLOCATABLE, SAVE, DIMENSION (:,:) :: pks 942 REAL :: unskap 943 ! Pression de vapeur saturante 944 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:) :: qsat 945 !Variables intermediaires interpolation 946 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: zu1,zu2 947 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: zv1,zv2 948 949 INTEGER :: i,j,l,ij 950 CHARACTER(LEN=20),PARAMETER :: modname="guide_interp" 951 TYPE(Request),SAVE :: Req 952 !$OMP THREADPRIVATE(Req) 953 954 if (is_master) WRITE(*,*)trim(modname)//': interpolate nudging variables' 955 ! ----------------------------------------------------------------- 956 ! Calcul des niveaux de pression champs guidage (pour T et Q) 957 ! ----------------------------------------------------------------- 958 IF (first) THEN 959 !$OMP MASTER 960 ALLOCATE(plnc1(iip1,jjb_u:jje_u,nlevnc) ) 961 ALLOCATE(plnc2(iip1,jjb_u:jje_u,nlevnc) ) 962 ALLOCATE(plunc(iip1,jjb_u:jje_u,llm) ) 963 ALLOCATE(plsnc(iip1,jjb_u:jje_u,llm) ) 964 ALLOCATE(plvnc(iip1,jjb_v:jje_v,llm) ) 965 ALLOCATE(p(iip1,jjb_u:jje_u,llmp1) ) 966 ALLOCATE(pls(iip1,jjb_u:jje_u,llm) ) 967 ALLOCATE(pext(iip1,jjb_u:jje_u,llm) ) 968 ALLOCATE(pbarx(iip1,jjb_u:jje_u,llm) ) 969 ALLOCATE(pbary(iip1,jjb_v:jje_v,llm) ) 970 ALLOCATE(pk(iip1,jjb_u:jje_u,llm) ) 971 ALLOCATE(pks (iip1,jjb_u:jje_u) ) 972 ALLOCATE(qsat(ijb_u:ije_u,llm) ) 973 ALLOCATE(zu1(iip1,jjb_u:jje_u,llm) ) 974 ALLOCATE(zu2(iip1,jjb_u:jje_u,llm) ) 975 ALLOCATE(zv1(iip1,jjb_v:jje_v,llm) ) 976 ALLOCATE(zv2(iip1,jjb_v:jje_v,llm) ) 977 !$OMP END MASTER 978 !$OMP BARRIER 979 ENDIF 980 981 982 983 984 IF (guide_plevs==0) THEN 985 !$OMP DO 986 DO l=1,nlevnc 987 DO j=jjbu,jjeu 988 DO i=1,iip1 989 plnc2(i,j,l)=apnc(l) 990 plnc1(i,j,l)=apnc(l) 991 ENDDO 992 ENDDO 993 ENDDO 994 ENDIF 995 996 if (first) THEN 997 first=.FALSE. 998 !$OMP MASTER 999 WRITE(*,*)trim(modname)//' : check vertical level order' 1000 WRITE(*,*)trim(modname)//' LMDZ :' 1001 do l=1,llm 1002 WRITE(*,*)trim(modname)//' PL(',l,')=',(ap(l)+ap(l+1))/2. & 1003 +psi(1,jjeu)*(bp(l)+bp(l+1))/2. 1004 enddo 1005 WRITE(*,*)trim(modname)//' nudging file :' 1006 SELECT CASE (guide_plevs) 1007 CASE (0) 1008 do l=1,nlevnc 1009 WRITE(*,*)trim(modname)//' PL(',l,')=',plnc2(1,jjbu,l) 1010 enddo 1011 CASE (1) 1012 DO l=1,nlevnc 1013 WRITE(*,*)trim(modname)//' PL(',l,')=',& 1014 apnc(l)+bpnc(l)*psnat2(1,jjbu) 1015 ENDDO 1016 CASE (2) 1017 do l=1,nlevnc 1018 WRITE(*,*)trim(modname)//' PL(',l,')=',pnat2(1,jjbu,l) 1019 enddo 1020 END SELECT 1021 WRITE(*,*)trim(modname)//' invert ordering: invert_p=',invert_p 1022 if (guide_u) THEN 1023 do l=1,nlevnc 1024 WRITE(*,*)trim(modname)//' U(',l,')=',unat2(1,jjbu,l) 1025 enddo 1026 endif 1027 if (guide_T) THEN 1028 do l=1,nlevnc 1029 WRITE(*,*)trim(modname)//' T(',l,')=',tnat2(1,jjbu,l) 1030 enddo 1031 endif 1032 !$OMP END MASTER 1033 endif ! of if (first) 1034 1035 if (guide_plevs /= 1 .or. guide_t .and. .not. guide_teta & 1036 .or. guide_q .and. guide_hr) THEN 1037 CALL pression_loc( ijnb_u, ap, bp, psi, p ) 1038 if (disvert_type==1) THEN 1039 CALL exner_hyb_loc(ijnb_u,psi,p,pks,pk) 1040 else ! we assume that we are in the disvert_type==2 case 1041 CALL exner_milieu_loc(ijnb_u,psi,p,pks,pk) 1042 endif 1043 end if 1044 1045 ! ----------------------------------------------------------------- 1046 ! Calcul niveaux pression modele 1047 ! ----------------------------------------------------------------- 1048 1049 ! .... Calcul de pls , pression au milieu des couches ,en Pascals 1050 IF (guide_plevs==1) THEN 1051 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1052 DO l=1,llm 1053 DO j=jjbu,jjeu 1054 DO i =1, iip1 1055 pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2. 1056 ENDDO 1057 ENDDO 1058 ENDDO 1059 ELSE 1060 unskap=1./kappa 1061 !$OMP BARRIER 1062 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1063 DO l = 1, llm 1064 DO j=jjbu,jjeu 1065 DO i =1, iip1 1066 pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap 1067 ENDDO 1068 ENDDO 1069 ENDDO 1070 ENDIF 1071 1072 ! calcul des pressions pour les grilles u et v 1073 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1074 do l=1,llm 1075 do j=jjbu,jjeu 1076 do i=1,iip1 1077 pext(i,j,l)=pls(i,j,l)*aire(i,j) 1078 enddo 1079 enddo 1080 enddo 1081 1082 CALL Register_Hallo_u(pext,llm,1,2,2,1,Req) 1083 CALL SendRequest(Req) 1084 !$OMP BARRIER 1085 CALL WaitRequest(Req) 1086 !$OMP BARRIER 1087 1088 CALL massbar_loc(pext, pbarx, pbary ) 1089 !$OMP BARRIER 1090 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1091 do l=1,llm 1092 do j=jjbu,jjeu 1093 do i=1,iip1 1094 plunc(i,j,l)=pbarx(i,j,l)/aireu(i,j) 1095 plsnc(i,j,l)=pls(i,j,l) 1096 enddo 1097 enddo 1098 enddo 1099 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1100 do l=1,llm 1101 do j=jjbv,jjev 1102 do i=1,iip1 1103 plvnc(i,j,l)=pbary(i,j,l)/airev(i,j) 1104 enddo 1105 enddo 1106 enddo 1107 1108 ! ----------------------------------------------------------------- 1109 ! Interpolation verticale champs guidage sur niveaux modele 1110 ! Conversion en variables gcm (ucov, vcov...) 1111 ! ----------------------------------------------------------------- 1112 if (guide_P) THEN 1113 !$OMP MASTER 1114 do j=jjbu,jjeu 1115 do i=1,iim 1116 ij=(j-1)*iip1+i 1117 psgui1(ij)=psnat1(i,j) 1118 psgui2(ij)=psnat2(i,j) 1119 enddo 1120 psgui1(iip1*j)=psnat1(1,j) 1121 psgui2(iip1*j)=psnat2(1,j) 1122 enddo 1123 !$OMP END MASTER 1124 !$OMP BARRIER 1125 endif 1126 1127 IF (guide_T) THEN 1128 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1129 IF (guide_plevs==1) THEN 1130 !$OMP DO 1131 DO l=1,nlevnc 1132 DO j=jjbu,jjeu 1133 DO i=1,iip1 1134 plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j) 1135 plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j) 1136 ENDDO 1137 ENDDO 1138 ENDDO 1139 ELSE IF (guide_plevs==2) THEN 1140 !$OMP DO 1141 DO l=1,nlevnc 1142 DO j=jjbu,jjeu 1143 DO i=1,iip1 1144 plnc2(i,j,l)=pnat2(i,j,l) 1145 plnc1(i,j,l)=pnat1(i,j,l) 1146 ENDDO 1147 ENDDO 1148 ENDDO 1149 ENDIF 1150 1151 ! Interpolation verticale 1152 !$OMP MASTER 1153 CALL pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 1154 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1155 CALL pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 1156 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1157 !$OMP END MASTER 1158 !$OMP BARRIER 1159 ! Conversion en variables GCM 1160 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1161 do l=1,llm 1162 do j=jjbu,jjeu 1163 IF (guide_teta) THEN 1164 do i=1,iim 1165 ij=(j-1)*iip1+i 1166 tgui1(ij,l)=zu1(i,j,l) 1167 tgui2(ij,l)=zu2(i,j,l) 1168 enddo 1169 ELSE 1170 do i=1,iim 1171 ij=(j-1)*iip1+i 1172 tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l) 1173 tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l) 1174 enddo 1175 ENDIF 1176 tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l) 1177 tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l) 1178 enddo 1179 if (pole_nord) THEN 1180 do i=1,iip1 1181 tgui1(i,l)=tgui1(1,l) 1182 tgui2(i,l)=tgui2(1,l) 1183 enddo 1184 endif 1185 if (pole_sud) THEN 1186 do i=1,iip1 1187 tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l) 1188 tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l) 1189 enddo 1190 endif 1191 enddo 1192 ENDIF 1193 1194 IF (guide_Q) THEN 1195 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1196 IF (guide_plevs==1) THEN 1197 !$OMP DO 1198 DO l=1,nlevnc 1199 DO j=jjbu,jjeu 1200 DO i=1,iip1 1201 plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j) 1202 plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j) 1203 ENDDO 1204 ENDDO 1205 ENDDO 1206 ELSE IF (guide_plevs==2) THEN 1207 !$OMP DO 1208 DO l=1,nlevnc 1209 DO j=jjbu,jjeu 1210 DO i=1,iip1 1211 plnc2(i,j,l)=pnat2(i,j,l) 1212 plnc1(i,j,l)=pnat1(i,j,l) 1213 ENDDO 1214 ENDDO 1215 ENDDO 1216 ENDIF 1217 1218 ! Interpolation verticale 1219 !$OMP MASTER 1220 CALL pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 1221 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1222 CALL pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 1223 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1224 !$OMP END MASTER 1225 !$OMP BARRIER 1226 1227 ! Conversion en variables GCM 1228 ! On suppose qu'on a la bonne variable dans le fichier de guidage: 1229 ! Hum.Rel si guide_hr, Hum.Spec. sinon. 1230 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1231 do l=1,llm 1232 do j=jjbu,jjeu 1233 do i=1,iim 1234 ij=(j-1)*iip1+i 1235 qgui1(ij,l)=zu1(i,j,l) 1236 qgui2(ij,l)=zu2(i,j,l) 1237 enddo 1238 qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l) 1239 qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l) 1240 enddo 1241 if (pole_nord) THEN 1242 do i=1,iip1 1243 qgui1(i,l)=qgui1(1,l) 1244 qgui2(i,l)=qgui2(1,l) 1245 enddo 1246 endif 1247 if (pole_sud) THEN 1248 do i=1,iip1 1249 qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l) 1250 qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l) 1251 enddo 1252 endif 1253 enddo 1254 IF (guide_hr) THEN 1255 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1256 do l=1,llm 1257 CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp, & 1258 plsnc(:,jjbu:jjeu,l),qsat(ijbu:ijeu,l)) 1259 qgui1(ijbu:ijeu,l)=qgui1(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 !hum. rel. en % 1260 qgui2(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 1261 enddo 1262 1263 ENDIF 1264 ENDIF 1265 1266 IF (guide_u) THEN 1267 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1268 IF (guide_plevs==1) THEN 1269 !$OMP DO 1270 DO l=1,nlevnc 1271 DO j=jjbu,jjeu 1272 DO i=1,iim 1273 plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha1p2(i,j) & 1274 +psnat2(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j) 1275 plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha1p2(i,j) & 1276 +psnat1(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j) 1277 ENDDO 1278 plnc2(iip1,j,l)=plnc2(1,j,l) 1279 plnc1(iip1,j,l)=plnc1(1,j,l) 1280 ENDDO 1281 ENDDO 1282 ELSE IF (guide_plevs==2) THEN 1283 !$OMP DO 1284 DO l=1,nlevnc 1285 DO j=jjbu,jjeu 1286 DO i=1,iim 1287 plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha1p2(i,j) & 1288 +pnat2(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j) 1289 plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha1p2(i,j) & 1290 +pnat1(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j) 1291 ENDDO 1292 plnc2(iip1,j,l)=plnc2(1,j,l) 1293 plnc1(iip1,j,l)=plnc1(1,j,l) 1294 ENDDO 1295 ENDDO 1296 ENDIF 1297 1298 ! Interpolation verticale 1299 !$OMP MASTER 1300 CALL pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 1301 plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1302 CALL pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 1303 plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1304 !$OMP END MASTER 1305 !$OMP BARRIER 1306 1307 ! Conversion en variables GCM 1308 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1309 do l=1,llm 1310 do j=jjbu,jjeu 1311 do i=1,iim 1312 ij=(j-1)*iip1+i 1313 ugui1(ij,l)=zu1(i,j,l)*cu(i,j) 1314 ugui2(ij,l)=zu2(i,j,l)*cu(i,j) 1315 enddo 1316 ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l) 1317 ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l) 1318 enddo 1319 if (pole_nord) THEN 1320 do i=1,iip1 1321 ugui1(i,l)=0. 1322 ugui2(i,l)=0. 1323 enddo 1324 endif 1325 if (pole_sud) THEN 1326 do i=1,iip1 1327 ugui1(ip1jm+i,l)=0. 1328 ugui2(ip1jm+i,l)=0. 1329 enddo 1330 endif 1331 enddo 1332 ENDIF 1333 1334 IF (guide_v) THEN 1335 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1336 IF (guide_plevs==1) THEN 1337 CALL Register_Hallo_u(psnat1,1,1,2,2,1,Req) 1338 CALL Register_Hallo_u(psnat2,1,1,2,2,1,Req) 1339 CALL SendRequest(Req) 1340 !$OMP BARRIER 1341 CALL WaitRequest(Req) 1342 !$OMP BARRIER 1343 !$OMP DO 1344 DO l=1,nlevnc 1345 DO j=jjbv,jjev 1346 DO i=1,iip1 1347 plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha2p3(i,j) & 1348 +psnat2(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j) 1349 plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha2p3(i,j) & 1350 +psnat1(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j) 1351 ENDDO 1352 ENDDO 1353 ENDDO 1354 ELSE IF (guide_plevs==2) THEN 1355 CALL Register_Hallo_u(pnat1,llm,1,2,2,1,Req) 1356 CALL Register_Hallo_u(pnat2,llm,1,2,2,1,Req) 1357 CALL SendRequest(Req) 1358 !$OMP BARRIER 1359 CALL WaitRequest(Req) 1360 !$OMP BARRIER 1361 !$OMP DO 1362 DO l=1,nlevnc 1363 DO j=jjbv,jjev 1364 DO i=1,iip1 1365 plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha2p3(i,j) & 1366 +pnat2(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j) 1367 plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha2p3(i,j) & 1368 +pnat1(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j) 1369 ENDDO 1370 ENDDO 1371 ENDDO 1372 ENDIF 1373 ! Interpolation verticale 1374 1375 !$OMP MASTER 1376 CALL pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm, & 1377 plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p) 1378 CALL pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm, & 1379 plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p) 1380 !$OMP END MASTER 1381 !$OMP BARRIER 1382 ! Conversion en variables GCM 1383 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1384 do l=1,llm 1385 do j=jjbv,jjev 1386 do i=1,iim 1387 ij=(j-1)*iip1+i 1388 vgui1(ij,l)=zv1(i,j,l)*cv(i,j) 1389 vgui2(ij,l)=zv2(i,j,l)*cv(i,j) 1390 enddo 1391 vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l) 1392 vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l) 1393 enddo 1394 enddo 1395 ENDIF 1396 1397 1398 END SUBROUTINE guide_interp 1399 1400 !======================================================================= 1401 SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha) 1402 1403 ! Calcul des constantes de rappel alpha (=1/tau) 1404 1405 use comconst_mod, ONLY: pi 1406 use serre_mod, ONLY: clat, clon, grossismx, grossismy 1407 904 905 !======================================================================= 906 SUBROUTINE guide_interp(psi, teta) 907 USE exner_hyb_loc_m, ONLY: exner_hyb_loc 908 USE exner_milieu_loc_m, ONLY: exner_milieu_loc 909 USE parallel_lmdz 910 USE mod_hallo 911 USE Bands 912 USE comconst_mod, ONLY: cpp, kappa 913 USE comvert_mod, ONLY: preff, pressure_exner, bp, ap, disvert_type 914 USE lmdz_q_sat, ONLY: q_sat 1408 915 IMPLICIT NONE 1409 916 … … 1412 919 include "comgeom2.h" 1413 920 1414 ! input arguments : 921 REAL, DIMENSION (iip1, jjb_u:jje_u), INTENT(IN) :: psi ! Psol gcm 922 REAL, DIMENSION (iip1, jjb_u:jje_u, llm), INTENT(IN) :: teta ! Temp. Pot. gcm 923 924 LOGICAL, SAVE :: first = .TRUE. 925 !$OMP THREADPRIVATE(first) 926 ! Variables pour niveaux pression: 927 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: plnc1, plnc2 !niveaux pression guidage 928 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: plunc, plsnc !niveaux pression modele 929 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: plvnc !niveaux pression modele 930 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: p ! pression intercouches 931 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: pls, pext ! var intermediaire 932 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: pbarx 933 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: pbary 934 ! Variables pour fonction Exner (P milieu couche) 935 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: pk 936 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: pks 937 REAL :: unskap 938 ! Pression de vapeur saturante 939 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :) :: qsat 940 !Variables intermediaires interpolation 941 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: zu1, zu2 942 REAL, ALLOCATABLE, SAVE, DIMENSION (:, :, :) :: zv1, zv2 943 944 INTEGER :: i, j, l, ij 945 CHARACTER(LEN = 20), PARAMETER :: modname = "guide_interp" 946 TYPE(Request), SAVE :: Req 947 !$OMP THREADPRIVATE(Req) 948 949 IF (is_master) WRITE(*, *)trim(modname) // ': interpolate nudging variables' 950 ! ----------------------------------------------------------------- 951 ! Calcul des niveaux de pression champs guidage (pour T et Q) 952 ! ----------------------------------------------------------------- 953 IF (first) THEN 954 !$OMP MASTER 955 ALLOCATE(plnc1(iip1, jjb_u:jje_u, nlevnc)) 956 ALLOCATE(plnc2(iip1, jjb_u:jje_u, nlevnc)) 957 ALLOCATE(plunc(iip1, jjb_u:jje_u, llm)) 958 ALLOCATE(plsnc(iip1, jjb_u:jje_u, llm)) 959 ALLOCATE(plvnc(iip1, jjb_v:jje_v, llm)) 960 ALLOCATE(p(iip1, jjb_u:jje_u, llmp1)) 961 ALLOCATE(pls(iip1, jjb_u:jje_u, llm)) 962 ALLOCATE(pext(iip1, jjb_u:jje_u, llm)) 963 ALLOCATE(pbarx(iip1, jjb_u:jje_u, llm)) 964 ALLOCATE(pbary(iip1, jjb_v:jje_v, llm)) 965 ALLOCATE(pk(iip1, jjb_u:jje_u, llm)) 966 ALLOCATE(pks (iip1, jjb_u:jje_u)) 967 ALLOCATE(qsat(ijb_u:ije_u, llm)) 968 ALLOCATE(zu1(iip1, jjb_u:jje_u, llm)) 969 ALLOCATE(zu2(iip1, jjb_u:jje_u, llm)) 970 ALLOCATE(zv1(iip1, jjb_v:jje_v, llm)) 971 ALLOCATE(zv2(iip1, jjb_v:jje_v, llm)) 972 !$OMP END MASTER 973 !$OMP BARRIER 974 ENDIF 975 976 IF (guide_plevs==0) THEN 977 !$OMP DO 978 DO l = 1, nlevnc 979 DO j = jjbu, jjeu 980 DO i = 1, iip1 981 plnc2(i, j, l) = apnc(l) 982 plnc1(i, j, l) = apnc(l) 983 ENDDO 984 ENDDO 985 ENDDO 986 ENDIF 987 988 IF (first) THEN 989 first = .FALSE. 990 !$OMP MASTER 991 WRITE(*, *)trim(modname) // ' : check vertical level order' 992 WRITE(*, *)trim(modname) // ' LMDZ :' 993 do l = 1, llm 994 WRITE(*, *)trim(modname) // ' PL(', l, ')=', (ap(l) + ap(l + 1)) / 2. & 995 + psi(1, jjeu) * (bp(l) + bp(l + 1)) / 2. 996 enddo 997 WRITE(*, *)trim(modname) // ' nudging file :' 998 SELECT CASE (guide_plevs) 999 CASE (0) 1000 do l = 1, nlevnc 1001 WRITE(*, *)trim(modname) // ' PL(', l, ')=', plnc2(1, jjbu, l) 1002 enddo 1003 CASE (1) 1004 DO l = 1, nlevnc 1005 WRITE(*, *)trim(modname) // ' PL(', l, ')=', & 1006 apnc(l) + bpnc(l) * psnat2(1, jjbu) 1007 ENDDO 1008 CASE (2) 1009 do l = 1, nlevnc 1010 WRITE(*, *)trim(modname) // ' PL(', l, ')=', pnat2(1, jjbu, l) 1011 enddo 1012 END SELECT 1013 WRITE(*, *)trim(modname) // ' invert ordering: invert_p=', invert_p 1014 IF (guide_u) THEN 1015 do l = 1, nlevnc 1016 WRITE(*, *)trim(modname) // ' U(', l, ')=', unat2(1, jjbu, l) 1017 enddo 1018 endif 1019 IF (guide_T) THEN 1020 do l = 1, nlevnc 1021 WRITE(*, *)trim(modname) // ' T(', l, ')=', tnat2(1, jjbu, l) 1022 enddo 1023 endif 1024 !$OMP END MASTER 1025 endif ! of if (first) 1026 1027 IF (guide_plevs /= 1 .OR. guide_t .AND. .NOT. guide_teta & 1028 .OR. guide_q .AND. guide_hr) THEN 1029 CALL pression_loc(ijnb_u, ap, bp, psi, p) 1030 IF (disvert_type==1) THEN 1031 CALL exner_hyb_loc(ijnb_u, psi, p, pks, pk) 1032 else ! we assume that we are in the disvert_type==2 case 1033 CALL exner_milieu_loc(ijnb_u, psi, p, pks, pk) 1034 endif 1035 end if 1036 1037 ! ----------------------------------------------------------------- 1038 ! Calcul niveaux pression modele 1039 ! ----------------------------------------------------------------- 1040 1041 ! .... Calcul de pls , pression au milieu des couches ,en Pascals 1042 IF (guide_plevs==1) THEN 1043 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1044 DO l = 1, llm 1045 DO j = jjbu, jjeu 1046 DO i = 1, iip1 1047 pls(i, j, l) = (ap(l) + ap(l + 1)) / 2. + psi(i, j) * (bp(l) + bp(l + 1)) / 2. 1048 ENDDO 1049 ENDDO 1050 ENDDO 1051 ELSE 1052 unskap = 1. / kappa 1053 !$OMP BARRIER 1054 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1055 DO l = 1, llm 1056 DO j = jjbu, jjeu 1057 DO i = 1, iip1 1058 pls(i, j, l) = preff * (pk(i, j, l) / cpp) ** unskap 1059 ENDDO 1060 ENDDO 1061 ENDDO 1062 ENDIF 1063 1064 ! calcul des pressions pour les grilles u et v 1065 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1066 do l = 1, llm 1067 do j = jjbu, jjeu 1068 do i = 1, iip1 1069 pext(i, j, l) = pls(i, j, l) * aire(i, j) 1070 enddo 1071 enddo 1072 enddo 1073 1074 CALL Register_Hallo_u(pext, llm, 1, 2, 2, 1, Req) 1075 CALL SendRequest(Req) 1076 !$OMP BARRIER 1077 CALL WaitRequest(Req) 1078 !$OMP BARRIER 1079 1080 CALL massbar_loc(pext, pbarx, pbary) 1081 !$OMP BARRIER 1082 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1083 do l = 1, llm 1084 do j = jjbu, jjeu 1085 do i = 1, iip1 1086 plunc(i, j, l) = pbarx(i, j, l) / aireu(i, j) 1087 plsnc(i, j, l) = pls(i, j, l) 1088 enddo 1089 enddo 1090 enddo 1091 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1092 do l = 1, llm 1093 do j = jjbv, jjev 1094 do i = 1, iip1 1095 plvnc(i, j, l) = pbary(i, j, l) / airev(i, j) 1096 enddo 1097 enddo 1098 enddo 1099 1100 ! ----------------------------------------------------------------- 1101 ! Interpolation verticale champs guidage sur niveaux modele 1102 ! Conversion en variables gcm (ucov, vcov...) 1103 ! ----------------------------------------------------------------- 1104 IF (guide_P) THEN 1105 !$OMP MASTER 1106 do j = jjbu, jjeu 1107 do i = 1, iim 1108 ij = (j - 1) * iip1 + i 1109 psgui1(ij) = psnat1(i, j) 1110 psgui2(ij) = psnat2(i, j) 1111 enddo 1112 psgui1(iip1 * j) = psnat1(1, j) 1113 psgui2(iip1 * j) = psnat2(1, j) 1114 enddo 1115 !$OMP END MASTER 1116 !$OMP BARRIER 1117 endif 1118 1119 IF (guide_T) THEN 1120 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1121 IF (guide_plevs==1) THEN 1122 !$OMP DO 1123 DO l = 1, nlevnc 1124 DO j = jjbu, jjeu 1125 DO i = 1, iip1 1126 plnc2(i, j, l) = apnc(l) + bpnc(l) * psnat2(i, j) 1127 plnc1(i, j, l) = apnc(l) + bpnc(l) * psnat1(i, j) 1128 ENDDO 1129 ENDDO 1130 ENDDO 1131 ELSE IF (guide_plevs==2) THEN 1132 !$OMP DO 1133 DO l = 1, nlevnc 1134 DO j = jjbu, jjeu 1135 DO i = 1, iip1 1136 plnc2(i, j, l) = pnat2(i, j, l) 1137 plnc1(i, j, l) = pnat1(i, j, l) 1138 ENDDO 1139 ENDDO 1140 ENDDO 1141 ENDIF 1142 1143 ! Interpolation verticale 1144 !$OMP MASTER 1145 CALL pres2lev(tnat1(:, jjbu:jjeu, :), zu1(:, jjbu:jjeu, :), nlevnc, llm, & 1146 plnc1(:, jjbu:jjeu, :), plsnc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1147 CALL pres2lev(tnat2(:, jjbu:jjeu, :), zu2(:, jjbu:jjeu, :), nlevnc, llm, & 1148 plnc2(:, jjbu:jjeu, :), plsnc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1149 !$OMP END MASTER 1150 !$OMP BARRIER 1151 ! Conversion en variables GCM 1152 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1153 do l = 1, llm 1154 do j = jjbu, jjeu 1155 IF (guide_teta) THEN 1156 do i = 1, iim 1157 ij = (j - 1) * iip1 + i 1158 tgui1(ij, l) = zu1(i, j, l) 1159 tgui2(ij, l) = zu2(i, j, l) 1160 enddo 1161 ELSE 1162 do i = 1, iim 1163 ij = (j - 1) * iip1 + i 1164 tgui1(ij, l) = zu1(i, j, l) * cpp / pk(i, j, l) 1165 tgui2(ij, l) = zu2(i, j, l) * cpp / pk(i, j, l) 1166 enddo 1167 ENDIF 1168 tgui1(j * iip1, l) = tgui1((j - 1) * iip1 + 1, l) 1169 tgui2(j * iip1, l) = tgui2((j - 1) * iip1 + 1, l) 1170 enddo 1171 IF (pole_nord) THEN 1172 do i = 1, iip1 1173 tgui1(i, l) = tgui1(1, l) 1174 tgui2(i, l) = tgui2(1, l) 1175 enddo 1176 endif 1177 IF (pole_sud) THEN 1178 do i = 1, iip1 1179 tgui1(ip1jm + i, l) = tgui1(ip1jm + 1, l) 1180 tgui2(ip1jm + i, l) = tgui2(ip1jm + 1, l) 1181 enddo 1182 endif 1183 enddo 1184 ENDIF 1185 1186 IF (guide_Q) THEN 1187 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1188 IF (guide_plevs==1) THEN 1189 !$OMP DO 1190 DO l = 1, nlevnc 1191 DO j = jjbu, jjeu 1192 DO i = 1, iip1 1193 plnc2(i, j, l) = apnc(l) + bpnc(l) * psnat2(i, j) 1194 plnc1(i, j, l) = apnc(l) + bpnc(l) * psnat1(i, j) 1195 ENDDO 1196 ENDDO 1197 ENDDO 1198 ELSE IF (guide_plevs==2) THEN 1199 !$OMP DO 1200 DO l = 1, nlevnc 1201 DO j = jjbu, jjeu 1202 DO i = 1, iip1 1203 plnc2(i, j, l) = pnat2(i, j, l) 1204 plnc1(i, j, l) = pnat1(i, j, l) 1205 ENDDO 1206 ENDDO 1207 ENDDO 1208 ENDIF 1209 1210 ! Interpolation verticale 1211 !$OMP MASTER 1212 CALL pres2lev(qnat1(:, jjbu:jjeu, :), zu1(:, jjbu:jjeu, :), nlevnc, llm, & 1213 plnc1(:, jjbu:jjeu, :), plsnc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1214 CALL pres2lev(qnat2(:, jjbu:jjeu, :), zu2(:, jjbu:jjeu, :), nlevnc, llm, & 1215 plnc2(:, jjbu:jjeu, :), plsnc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1216 !$OMP END MASTER 1217 !$OMP BARRIER 1218 1219 ! Conversion en variables GCM 1220 ! On suppose qu'on a la bonne variable dans le fichier de guidage: 1221 ! Hum.Rel si guide_hr, Hum.Spec. sinon. 1222 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1223 do l = 1, llm 1224 do j = jjbu, jjeu 1225 do i = 1, iim 1226 ij = (j - 1) * iip1 + i 1227 qgui1(ij, l) = zu1(i, j, l) 1228 qgui2(ij, l) = zu2(i, j, l) 1229 enddo 1230 qgui1(j * iip1, l) = qgui1((j - 1) * iip1 + 1, l) 1231 qgui2(j * iip1, l) = qgui2((j - 1) * iip1 + 1, l) 1232 enddo 1233 IF (pole_nord) THEN 1234 do i = 1, iip1 1235 qgui1(i, l) = qgui1(1, l) 1236 qgui2(i, l) = qgui2(1, l) 1237 enddo 1238 endif 1239 IF (pole_sud) THEN 1240 do i = 1, iip1 1241 qgui1(ip1jm + i, l) = qgui1(ip1jm + 1, l) 1242 qgui2(ip1jm + i, l) = qgui2(ip1jm + 1, l) 1243 enddo 1244 endif 1245 enddo 1246 IF (guide_hr) THEN 1247 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1248 do l = 1, llm 1249 CALL q_sat(iip1 * jjnu, teta(:, jjbu:jjeu, l) * pk(:, jjbu:jjeu, l) / cpp, & 1250 plsnc(:, jjbu:jjeu, l), qsat(ijbu:ijeu, l)) 1251 qgui1(ijbu:ijeu, l) = qgui1(ijbu:ijeu, l) * qsat(ijbu:ijeu, l) * 0.01 !hum. rel. en % 1252 qgui2(ijbu:ijeu, l) = qgui2(ijbu:ijeu, l) * qsat(ijbu:ijeu, l) * 0.01 1253 enddo 1254 1255 ENDIF 1256 ENDIF 1257 1258 IF (guide_u) THEN 1259 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1260 IF (guide_plevs==1) THEN 1261 !$OMP DO 1262 DO l = 1, nlevnc 1263 DO j = jjbu, jjeu 1264 DO i = 1, iim 1265 plnc2(i, j, l) = apnc(l) + bpnc(l) * (psnat2(i, j) * aire(i, j) * alpha1p2(i, j) & 1266 + psnat2(i + 1, j) * aire(i + 1, j) * alpha3p4(i + 1, j)) / aireu(i, j) 1267 plnc1(i, j, l) = apnc(l) + bpnc(l) * (psnat1(i, j) * aire(i, j) * alpha1p2(i, j) & 1268 + psnat1(i + 1, j) * aire(i + 1, j) * alpha3p4(i + 1, j)) / aireu(i, j) 1269 ENDDO 1270 plnc2(iip1, j, l) = plnc2(1, j, l) 1271 plnc1(iip1, j, l) = plnc1(1, j, l) 1272 ENDDO 1273 ENDDO 1274 ELSE IF (guide_plevs==2) THEN 1275 !$OMP DO 1276 DO l = 1, nlevnc 1277 DO j = jjbu, jjeu 1278 DO i = 1, iim 1279 plnc2(i, j, l) = (pnat2(i, j, l) * aire(i, j) * alpha1p2(i, j) & 1280 + pnat2(i + 1, j, l) * aire(i, j) * alpha3p4(i + 1, j)) / aireu(i, j) 1281 plnc1(i, j, l) = (pnat1(i, j, l) * aire(i, j) * alpha1p2(i, j) & 1282 + pnat1(i + 1, j, l) * aire(i, j) * alpha3p4(i + 1, j)) / aireu(i, j) 1283 ENDDO 1284 plnc2(iip1, j, l) = plnc2(1, j, l) 1285 plnc1(iip1, j, l) = plnc1(1, j, l) 1286 ENDDO 1287 ENDDO 1288 ENDIF 1289 1290 ! Interpolation verticale 1291 !$OMP MASTER 1292 CALL pres2lev(unat1(:, jjbu:jjeu, :), zu1(:, jjbu:jjeu, :), nlevnc, llm, & 1293 plnc1(:, jjbu:jjeu, :), plunc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1294 CALL pres2lev(unat2(:, jjbu:jjeu, :), zu2(:, jjbu:jjeu, :), nlevnc, llm, & 1295 plnc2(:, jjbu:jjeu, :), plunc(:, jjbu:jjeu, :), iip1, jjnu, invert_p) 1296 !$OMP END MASTER 1297 !$OMP BARRIER 1298 1299 ! Conversion en variables GCM 1300 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1301 do l = 1, llm 1302 do j = jjbu, jjeu 1303 do i = 1, iim 1304 ij = (j - 1) * iip1 + i 1305 ugui1(ij, l) = zu1(i, j, l) * cu(i, j) 1306 ugui2(ij, l) = zu2(i, j, l) * cu(i, j) 1307 enddo 1308 ugui1(j * iip1, l) = ugui1((j - 1) * iip1 + 1, l) 1309 ugui2(j * iip1, l) = ugui2((j - 1) * iip1 + 1, l) 1310 enddo 1311 IF (pole_nord) THEN 1312 do i = 1, iip1 1313 ugui1(i, l) = 0. 1314 ugui2(i, l) = 0. 1315 enddo 1316 endif 1317 IF (pole_sud) THEN 1318 do i = 1, iip1 1319 ugui1(ip1jm + i, l) = 0. 1320 ugui2(ip1jm + i, l) = 0. 1321 enddo 1322 endif 1323 enddo 1324 ENDIF 1325 1326 IF (guide_v) THEN 1327 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1328 IF (guide_plevs==1) THEN 1329 CALL Register_Hallo_u(psnat1, 1, 1, 2, 2, 1, Req) 1330 CALL Register_Hallo_u(psnat2, 1, 1, 2, 2, 1, Req) 1331 CALL SendRequest(Req) 1332 !$OMP BARRIER 1333 CALL WaitRequest(Req) 1334 !$OMP BARRIER 1335 !$OMP DO 1336 DO l = 1, nlevnc 1337 DO j = jjbv, jjev 1338 DO i = 1, iip1 1339 plnc2(i, j, l) = apnc(l) + bpnc(l) * (psnat2(i, j) * aire(i, j) * alpha2p3(i, j) & 1340 + psnat2(i, j + 1) * aire(i, j + 1) * alpha1p4(i, j + 1)) / airev(i, j) 1341 plnc1(i, j, l) = apnc(l) + bpnc(l) * (psnat1(i, j) * aire(i, j) * alpha2p3(i, j) & 1342 + psnat1(i, j + 1) * aire(i, j + 1) * alpha1p4(i, j + 1)) / airev(i, j) 1343 ENDDO 1344 ENDDO 1345 ENDDO 1346 ELSE IF (guide_plevs==2) THEN 1347 CALL Register_Hallo_u(pnat1, llm, 1, 2, 2, 1, Req) 1348 CALL Register_Hallo_u(pnat2, llm, 1, 2, 2, 1, Req) 1349 CALL SendRequest(Req) 1350 !$OMP BARRIER 1351 CALL WaitRequest(Req) 1352 !$OMP BARRIER 1353 !$OMP DO 1354 DO l = 1, nlevnc 1355 DO j = jjbv, jjev 1356 DO i = 1, iip1 1357 plnc2(i, j, l) = (pnat2(i, j, l) * aire(i, j) * alpha2p3(i, j) & 1358 + pnat2(i, j + 1, l) * aire(i, j) * alpha1p4(i, j + 1)) / airev(i, j) 1359 plnc1(i, j, l) = (pnat1(i, j, l) * aire(i, j) * alpha2p3(i, j) & 1360 + pnat1(i, j + 1, l) * aire(i, j) * alpha1p4(i, j + 1)) / airev(i, j) 1361 ENDDO 1362 ENDDO 1363 ENDDO 1364 ENDIF 1365 ! Interpolation verticale 1366 1367 !$OMP MASTER 1368 CALL pres2lev(vnat1(:, jjbv:jjev, :), zv1(:, jjbv:jjev, :), nlevnc, llm, & 1369 plnc1(:, jjbv:jjev, :), plvnc(:, jjbv:jjev, :), iip1, jjnv, invert_p) 1370 CALL pres2lev(vnat2(:, jjbv:jjev, :), zv2(:, jjbv:jjev, :), nlevnc, llm, & 1371 plnc2(:, jjbv:jjev, :), plvnc(:, jjbv:jjev, :), iip1, jjnv, invert_p) 1372 !$OMP END MASTER 1373 !$OMP BARRIER 1374 ! Conversion en variables GCM 1375 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1376 do l = 1, llm 1377 do j = jjbv, jjev 1378 do i = 1, iim 1379 ij = (j - 1) * iip1 + i 1380 vgui1(ij, l) = zv1(i, j, l) * cv(i, j) 1381 vgui2(ij, l) = zv2(i, j, l) * cv(i, j) 1382 enddo 1383 vgui1(j * iip1, l) = vgui1((j - 1) * iip1 + 1, l) 1384 vgui2(j * iip1, l) = vgui2((j - 1) * iip1 + 1, l) 1385 enddo 1386 enddo 1387 ENDIF 1388 1389 END SUBROUTINE guide_interp 1390 1391 !======================================================================= 1392 SUBROUTINE tau2alpha(typ, pim, jjb, jje, factt, taumin, taumax, alpha) 1393 1394 ! Calcul des constantes de rappel alpha (=1/tau) 1395 1396 USE comconst_mod, ONLY: pi 1397 USE serre_mod, ONLY: clat, clon, grossismx, grossismy 1398 1399 IMPLICIT NONE 1400 1401 include "dimensions.h" 1402 include "paramet.h" 1403 include "comgeom2.h" 1404 1405 ! input arguments : 1415 1406 INTEGER, INTENT(IN) :: typ ! u(2),v(3), ou scalaire(1) 1416 1407 INTEGER, INTENT(IN) :: pim ! dimensions en lon 1417 INTEGER, INTENT(IN) :: jjb,jje ! dimensions en lat 1418 REAL, INTENT(IN) :: factt ! pas de temps en fraction de jour 1419 REAL, INTENT(IN) :: taumin,taumax 1420 ! output arguments: 1421 REAL, DIMENSION(pim,jjb:jje), INTENT(OUT) :: alpha 1422 1423 ! local variables: 1424 LOGICAL, SAVE :: first=.TRUE. 1425 REAL, SAVE :: gamma,dxdy_min,dxdy_max 1426 REAL, DIMENSION (iip1,jjp1) :: zdx,zdy 1427 REAL, DIMENSION (iip1,jjp1) :: dxdys,dxdyu 1428 REAL, DIMENSION (iip1,jjm) :: dxdyv 1429 real dxdy_ 1430 real zlat,zlon 1431 real alphamin,alphamax,xi 1432 integer i,j,ilon,ilat 1433 CHARACTER(LEN=20),parameter :: modname="tau2alpha" 1434 1435 1436 alphamin=factt/taumax 1437 alphamax=factt/taumin 1408 INTEGER, INTENT(IN) :: jjb, jje ! dimensions en lat 1409 REAL, INTENT(IN) :: factt ! pas de temps en fraction de jour 1410 REAL, INTENT(IN) :: taumin, taumax 1411 ! output arguments: 1412 REAL, DIMENSION(pim, jjb:jje), INTENT(OUT) :: alpha 1413 1414 ! local variables: 1415 LOGICAL, SAVE :: first = .TRUE. 1416 REAL, SAVE :: gamma, dxdy_min, dxdy_max 1417 REAL, DIMENSION (iip1, jjp1) :: zdx, zdy 1418 REAL, DIMENSION (iip1, jjp1) :: dxdys, dxdyu 1419 REAL, DIMENSION (iip1, jjm) :: dxdyv 1420 REAL dxdy_ 1421 REAL zlat, zlon 1422 REAL alphamin, alphamax, xi 1423 INTEGER i, j, ilon, ilat 1424 CHARACTER(LEN = 20), parameter :: modname = "tau2alpha" 1425 1426 alphamin = factt / taumax 1427 alphamax = factt / taumin 1438 1428 IF (guide_reg.OR.guide_add) THEN 1439 alpha=alphamax1440 !-----------------------------------------------------------------------1441 ! guide_reg: alpha=alpha_min dans region, 0. sinon.1442 !-----------------------------------------------------------------------1443 1444 do j=jjb,jje1445 do i=1,pim1446 if(typ==2) THEN1447 zlat=rlatu(j)*180./pi1448 zlon=rlonu(i)*180./pi1449 1450 zlat=rlatu(j)*180./pi1451 zlon=rlonv(i)*180./pi1452 1453 zlat=rlatv(j)*180./pi1454 zlon=rlonv(i)*180./pi1455 1456 alpha(i,j)=alphamax/16.* &1457 (1.+tanh((zlat-lat_min_g)/tau_lat))* &1458 (1.+tanh((lat_max_g-zlat)/tau_lat))* &1459 (1.+tanh((zlon-lon_min_g)/tau_lon))* &1460 (1.+tanh((lon_max_g-zlon)/tau_lon))1461 1462 1463 1429 alpha = alphamax 1430 !----------------------------------------------------------------------- 1431 ! guide_reg: alpha=alpha_min dans region, 0. sinon. 1432 !----------------------------------------------------------------------- 1433 IF (guide_reg) THEN 1434 do j = jjb, jje 1435 do i = 1, pim 1436 IF (typ==2) THEN 1437 zlat = rlatu(j) * 180. / pi 1438 zlon = rlonu(i) * 180. / pi 1439 elseif (typ==1) THEN 1440 zlat = rlatu(j) * 180. / pi 1441 zlon = rlonv(i) * 180. / pi 1442 elseif (typ==3) THEN 1443 zlat = rlatv(j) * 180. / pi 1444 zlon = rlonv(i) * 180. / pi 1445 endif 1446 alpha(i, j) = alphamax / 16. * & 1447 (1. + tanh((zlat - lat_min_g) / tau_lat)) * & 1448 (1. + tanh((lat_max_g - zlat) / tau_lat)) * & 1449 (1. + tanh((zlon - lon_min_g) / tau_lon)) * & 1450 (1. + tanh((lon_max_g - zlon) / tau_lon)) 1451 enddo 1452 enddo 1453 ENDIF 1464 1454 ELSE 1465 !----------------------------------------------------------------------- 1466 ! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom. 1467 !----------------------------------------------------------------------- 1468 !Calcul de l'aire des mailles 1469 do j=2,jjm 1470 do i=2,iip1 1471 zdx(i,j)=0.5*(cu(i-1,j)+cu(i,j))/cos(rlatu(j)) 1472 enddo 1473 zdx(1,j)=zdx(iip1,j) 1455 !----------------------------------------------------------------------- 1456 ! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom. 1457 !----------------------------------------------------------------------- 1458 !Calcul de l'aire des mailles 1459 do j = 2, jjm 1460 do i = 2, iip1 1461 zdx(i, j) = 0.5 * (cu(i - 1, j) + cu(i, j)) / cos(rlatu(j)) 1474 1462 enddo 1475 do j=2,jjm 1476 do i=1,iip1 1477 zdy(i,j)=0.5*(cv(i,j-1)+cv(i,j)) 1478 enddo 1463 zdx(1, j) = zdx(iip1, j) 1464 enddo 1465 do j = 2, jjm 1466 do i = 1, iip1 1467 zdy(i, j) = 0.5 * (cv(i, j - 1) + cv(i, j)) 1479 1468 enddo 1480 do i=1,iip1 1481 zdx(i,1)=zdx(i,2) 1482 zdx(i,jjp1)=zdx(i,jjm) 1483 zdy(i,1)=zdy(i,2) 1484 zdy(i,jjp1)=zdy(i,jjm) 1469 enddo 1470 do i = 1, iip1 1471 zdx(i, 1) = zdx(i, 2) 1472 zdx(i, jjp1) = zdx(i, jjm) 1473 zdy(i, 1) = zdy(i, 2) 1474 zdy(i, jjp1) = zdy(i, jjm) 1475 enddo 1476 do j = 1, jjp1 1477 do i = 1, iip1 1478 dxdys(i, j) = sqrt(zdx(i, j) * zdx(i, j) + zdy(i, j) * zdy(i, j)) 1485 1479 enddo 1486 do j=1,jjp1 1487 do i=1,iip1 1488 dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j)) 1489 enddo 1480 enddo 1481 IF (typ==2) THEN 1482 do j = 1, jjp1 1483 do i = 1, iim 1484 dxdyu(i, j) = 0.5 * (dxdys(i, j) + dxdys(i + 1, j)) 1485 enddo 1486 dxdyu(iip1, j) = dxdyu(1, j) 1490 1487 enddo 1491 IF (typ==2) THEN 1492 do j=1,jjp1 1493 do i=1,iim 1494 dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j)) 1495 enddo 1496 dxdyu(iip1,j)=dxdyu(1,j) 1497 enddo 1498 ENDIF 1499 IF (typ==3) THEN 1500 do j=1,jjm 1501 do i=1,iip1 1502 dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1)) 1503 enddo 1504 enddo 1505 ENDIF 1506 ! Premier appel: calcul des aires min et max et de gamma. 1507 IF (first) THEN 1508 first=.FALSE. 1509 ! coordonnees du centre du zoom 1510 CALL coordij(clon,clat,ilon,ilat) 1511 ! aire de la maille au centre du zoom 1512 dxdy_min=dxdys(ilon,ilat) 1513 ! dxdy maximale de la maille 1514 dxdy_max=0. 1515 do j=1,jjp1 1516 do i=1,iip1 1517 dxdy_max=max(dxdy_max,dxdys(i,j)) 1518 enddo 1519 enddo 1520 ! Calcul de gamma 1521 if (abs(grossismx-1.)<0.1.or.abs(grossismy-1.)<0.1) THEN 1522 WRITE(*,*)trim(modname)//' ATTENTION modele peu zoome' 1523 WRITE(*,*)trim(modname)//' ATTENTION on prend une constante de guidage cste' 1524 gamma=0. 1488 ENDIF 1489 IF (typ==3) THEN 1490 do j = 1, jjm 1491 do i = 1, iip1 1492 dxdyv(i, j) = 0.5 * (dxdys(i, j) + dxdys(i, j + 1)) 1493 enddo 1494 enddo 1495 ENDIF 1496 ! Premier appel: calcul des aires min et max et de gamma. 1497 IF (first) THEN 1498 first = .FALSE. 1499 ! coordonnees du centre du zoom 1500 CALL coordij(clon, clat, ilon, ilat) 1501 ! aire de la maille au centre du zoom 1502 dxdy_min = dxdys(ilon, ilat) 1503 ! dxdy maximale de la maille 1504 dxdy_max = 0. 1505 do j = 1, jjp1 1506 do i = 1, iip1 1507 dxdy_max = max(dxdy_max, dxdys(i, j)) 1508 enddo 1509 enddo 1510 ! Calcul de gamma 1511 IF (abs(grossismx - 1.)<0.1.OR.abs(grossismy - 1.)<0.1) THEN 1512 WRITE(*, *)trim(modname) // ' ATTENTION modele peu zoome' 1513 WRITE(*, *)trim(modname) // ' ATTENTION on prend une constante de guidage cste' 1514 gamma = 0. 1515 else 1516 gamma = (dxdy_max - 2. * dxdy_min) / (dxdy_max - dxdy_min) 1517 WRITE(*, *)trim(modname) // ' gamma=', gamma 1518 IF (gamma<1.e-5) THEN 1519 WRITE(*, *)trim(modname) // ' gamma =', gamma, '<1e-5' 1520 CALL abort_gcm("guide_loc_mod", "stopped", 1) 1521 endif 1522 gamma = log(0.5) / log(gamma) 1523 IF (gamma4) THEN 1524 gamma = min(gamma, 4.) 1525 endif 1526 WRITE(*, *)trim(modname) // ' gamma=', gamma 1527 endif 1528 ENDIF !first 1529 1530 do j = jjb, jje 1531 do i = 1, pim 1532 IF (typ==1) THEN 1533 dxdy_ = dxdys(i, j) 1534 zlat = rlatu(j) * 180. / pi 1535 elseif (typ==2) THEN 1536 dxdy_ = dxdyu(i, j) 1537 zlat = rlatu(j) * 180. / pi 1538 elseif (typ==3) THEN 1539 dxdy_ = dxdyv(i, j) 1540 zlat = rlatv(j) * 180. / pi 1541 endif 1542 IF (abs(grossismx - 1.)<0.1.OR.abs(grossismy - 1.)<0.1) THEN 1543 ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin 1544 alpha(i, j) = alphamin 1545 else 1546 xi = ((dxdy_max - dxdy_) / (dxdy_max - dxdy_min))**gamma 1547 xi = min(xi, 1.) 1548 IF(lat_min_g<=zlat .AND. zlat<=lat_max_g) THEN 1549 alpha(i, j) = xi * alphamin + (1. - xi) * alphamax 1525 1550 else 1526 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min) 1527 WRITE(*,*)trim(modname)//' gamma=',gamma 1528 if (gamma<1.e-5) THEN 1529 WRITE(*,*)trim(modname)//' gamma =',gamma,'<1e-5' 1530 CALL abort_gcm("guide_loc_mod","stopped",1) 1531 endif 1532 gamma=log(0.5)/log(gamma) 1533 if (gamma4) THEN 1534 gamma=min(gamma,4.) 1535 endif 1536 WRITE(*,*)trim(modname)//' gamma=',gamma 1551 alpha(i, j) = 0. 1537 1552 endif 1538 ENDIF !first 1539 1540 do j=jjb,jje 1541 do i=1,pim 1542 if (typ==1) THEN 1543 dxdy_=dxdys(i,j) 1544 zlat=rlatu(j)*180./pi 1545 elseif (typ==2) THEN 1546 dxdy_=dxdyu(i,j) 1547 zlat=rlatu(j)*180./pi 1548 elseif (typ==3) THEN 1549 dxdy_=dxdyv(i,j) 1550 zlat=rlatv(j)*180./pi 1551 endif 1552 if (abs(grossismx-1.)<0.1.or.abs(grossismy-1.)<0.1) THEN 1553 ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin 1554 alpha(i,j)=alphamin 1555 else 1556 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma 1557 xi=min(xi,1.) 1558 IF(lat_min_g<=zlat .and. zlat<=lat_max_g) THEN 1559 alpha(i,j)=xi*alphamin+(1.-xi)*alphamax 1560 else 1561 alpha(i,j)=0. 1562 endif 1563 endif 1564 enddo 1553 endif 1565 1554 enddo 1555 enddo 1566 1556 ENDIF ! guide_reg 1567 1557 1568 if (.not. guide_add) alpha = 1. - exp(- alpha)1558 IF (.NOT. guide_add) alpha = 1. - exp(- alpha) 1569 1559 1570 1560 END SUBROUTINE tau2alpha 1571 1561 1572 !=======================================================================1562 !======================================================================= 1573 1563 SUBROUTINE guide_read(timestep) 1574 1564 … … 1578 1568 include "paramet.h" 1579 1569 1580 INTEGER, INTENT(IN) :: timestep 1581 1582 LOGICAL, SAVE :: first=.TRUE. 1583 ! Identification fichiers et variables NetCDF: 1584 INTEGER, SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp 1585 INTEGER, SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps 1586 INTEGER :: ncidpl,varidpl,varidap,varidbp,dimid,lendim 1587 ! Variables auxiliaires NetCDF: 1588 INTEGER, DIMENSION(4) :: start,count 1589 INTEGER :: status,rcode 1590 CHARACTER (len = 80) :: abort_message 1591 CHARACTER (len = 20) :: modname = 'guide_read' 1592 CHARACTER (len = 20) :: namedim 1593 abort_message='pb in guide_read' 1594 1595 ! ----------------------------------------------------------------- 1596 ! Premier appel: initialisation de la lecture des fichiers 1597 ! ----------------------------------------------------------------- 1598 if (first) THEN 1599 ncidpl=-99 1600 WRITE(*,*) trim(modname)//': opening nudging files ' 1601 ! Ap et Bp si Niveaux de pression hybrides 1602 if (guide_plevs==1) THEN 1603 WRITE(*,*) trim(modname)//' Reading nudging on model levels' 1604 rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl) 1605 IF (rcode/=nf90_noerr) THEN 1606 abort_message='Nudging: error -> no file apbp.nc' 1607 CALL abort_gcm(modname,abort_message,1) 1608 ENDIF 1609 rcode = nf90_inq_varid(ncidpl, 'AP', varidap) 1610 IF (rcode/=nf90_noerr) THEN 1611 abort_message='Nudging: error -> no AP variable in file apbp.nc' 1612 CALL abort_gcm(modname,abort_message,1) 1613 ENDIF 1614 rcode = nf90_inq_varid(ncidpl, 'BP', varidbp) 1615 IF (rcode/=nf90_noerr) THEN 1616 abort_message='Nudging: error -> no BP variable in file apbp.nc' 1617 CALL abort_gcm(modname,abort_message,1) 1618 ENDIF 1619 WRITE(*,*) trim(modname)//' ncidpl,varidap',ncidpl,varidap 1620 endif 1621 1622 ! Pression si guidage sur niveaux P variables 1623 if (guide_plevs==2) THEN 1624 rcode = nf90_open('P.nc', nf90_nowrite, ncidp) 1625 IF (rcode/=nf90_noerr) THEN 1626 abort_message='Nudging: error -> no file P.nc' 1627 CALL abort_gcm(modname,abort_message,1) 1628 ENDIF 1629 rcode = nf90_inq_varid(ncidp, 'PRES', varidp) 1630 IF (rcode/=nf90_noerr) THEN 1631 abort_message='Nudging: error -> no PRES variable in file P.nc' 1632 CALL abort_gcm(modname,abort_message,1) 1633 ENDIF 1634 WRITE(*,*) trim(modname)//' ncidp,varidp',ncidp,varidp 1635 if (ncidpl==-99) ncidpl=ncidp 1636 endif 1637 1638 ! Vent zonal 1639 if (guide_u) THEN 1640 rcode = nf90_open('u.nc', nf90_nowrite, ncidu) 1641 IF (rcode/=nf90_noerr) THEN 1642 abort_message='Nudging: error -> no file u.nc' 1643 CALL abort_gcm(modname,abort_message,1) 1644 ENDIF 1645 rcode = nf90_inq_varid(ncidu, 'UWND', varidu) 1646 IF (rcode/=nf90_noerr) THEN 1647 abort_message='Nudging: error -> no UWND variable in file u.nc' 1648 CALL abort_gcm(modname,abort_message,1) 1649 ENDIF 1650 WRITE(*,*) trim(modname)//' ncidu,varidu',ncidu,varidu 1651 if (ncidpl==-99) ncidpl=ncidu 1652 1653 1654 status=nf90_inq_dimid(ncidu, "LONU", dimid) 1655 status=nf90_inquire_dimension(ncidu,dimid,namedim,lendim) 1656 IF (lendim /= iip1) THEN 1657 abort_message='dimension LONU different from iip1 in u.nc' 1658 CALL abort_gcm(modname,abort_message,1) 1659 ENDIF 1660 1661 status=nf90_inq_dimid(ncidu, "LATU", dimid) 1662 status=nf90_inquire_dimension(ncidu,dimid,namedim,lendim) 1663 IF (lendim /= jjp1) THEN 1664 abort_message='dimension LATU different from jjp1 in u.nc' 1665 CALL abort_gcm(modname,abort_message,1) 1666 ENDIF 1667 1668 endif 1669 1670 ! Vent meridien 1671 if (guide_v) THEN 1672 rcode = nf90_open('v.nc', nf90_nowrite, ncidv) 1673 IF (rcode/=nf90_noerr) THEN 1674 abort_message='Nudging: error -> no file v.nc' 1675 CALL abort_gcm(modname,abort_message,1) 1676 ENDIF 1677 rcode = nf90_inq_varid(ncidv, 'VWND', varidv) 1678 IF (rcode/=nf90_noerr) THEN 1679 abort_message='Nudging: error -> no VWND variable in file v.nc' 1680 CALL abort_gcm(modname,abort_message,1) 1681 ENDIF 1682 WRITE(*,*) trim(modname)//' ncidv,varidv',ncidv,varidv 1683 if (ncidpl==-99) ncidpl=ncidv 1684 1685 status=nf90_inq_dimid(ncidv, "LONV", dimid) 1686 status=nf90_inquire_dimension(ncidv,dimid,namedim,lendim) 1687 1688 IF (lendim /= iip1) THEN 1689 abort_message='dimension LONV different from iip1 in v.nc' 1690 CALL abort_gcm(modname,abort_message,1) 1691 ENDIF 1692 1693 1694 status=nf90_inq_dimid(ncidv, "LATV", dimid) 1695 status=nf90_inquire_dimension(ncidv,dimid,namedim,lendim) 1696 IF (lendim /= jjm) THEN 1697 abort_message='dimension LATV different from jjm in v.nc' 1698 CALL abort_gcm(modname,abort_message,1) 1699 ENDIF 1700 1701 endif 1702 1703 ! Temperature 1704 if (guide_T) THEN 1705 rcode = nf90_open('T.nc', nf90_nowrite, ncidt) 1706 IF (rcode/=nf90_noerr) THEN 1707 abort_message='Nudging: error -> no file T.nc' 1708 CALL abort_gcm(modname,abort_message,1) 1709 ENDIF 1710 rcode = nf90_inq_varid(ncidt, 'AIR', varidt) 1711 IF (rcode/=nf90_noerr) THEN 1712 abort_message='Nudging: error -> no AIR variable in file T.nc' 1713 CALL abort_gcm(modname,abort_message,1) 1714 ENDIF 1715 WRITE(*,*) trim(modname)//' ncidT,varidT',ncidt,varidt 1716 if (ncidpl==-99) ncidpl=ncidt 1717 1718 status=nf90_inq_dimid(ncidt, "LONV", dimid) 1719 status=nf90_inquire_dimension(ncidt,dimid,namedim,lendim) 1720 IF (lendim /= iip1) THEN 1721 abort_message='dimension LONV different from iip1 in T.nc' 1722 CALL abort_gcm(modname,abort_message,1) 1723 ENDIF 1724 1725 status=nf90_inq_dimid(ncidt, "LATU", dimid) 1726 status=nf90_inquire_dimension(ncidt,dimid,namedim,lendim) 1727 IF (lendim /= jjp1) THEN 1728 abort_message='dimension LATU different from jjp1 in T.nc' 1729 CALL abort_gcm(modname,abort_message,1) 1730 ENDIF 1731 1732 endif 1733 1734 ! Humidite 1735 if (guide_Q) THEN 1736 rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ) 1737 IF (rcode/=nf90_noerr) THEN 1738 abort_message='Nudging: error -> no file hur.nc' 1739 CALL abort_gcm(modname,abort_message,1) 1740 ENDIF 1741 rcode = nf90_inq_varid(ncidQ, 'RH', varidQ) 1742 IF (rcode/=nf90_noerr) THEN 1743 abort_message='Nudging: error -> no RH variable in file hur.nc' 1744 CALL abort_gcm(modname,abort_message,1) 1745 ENDIF 1746 WRITE(*,*) trim(modname)//' ncidQ,varidQ',ncidQ,varidQ 1747 if (ncidpl==-99) ncidpl=ncidQ 1748 1749 1750 status=nf90_inq_dimid(ncidQ, "LONV", dimid) 1751 status=nf90_inquire_dimension(ncidQ,dimid,namedim,lendim) 1752 IF (lendim /= iip1) THEN 1753 abort_message='dimension LONV different from iip1 in hur.nc' 1754 CALL abort_gcm(modname,abort_message,1) 1755 ENDIF 1756 1757 status=nf90_inq_dimid(ncidQ, "LATU", dimid) 1758 status=nf90_inquire_dimension(ncidQ,dimid,namedim,lendim) 1759 IF (lendim /= jjp1) THEN 1760 abort_message='dimension LATU different from jjp1 in hur.nc' 1761 CALL abort_gcm(modname,abort_message,1) 1762 ENDIF 1763 1764 1765 endif 1766 ! Pression de surface 1767 if ((guide_P).OR.(guide_plevs==1)) THEN 1768 rcode = nf90_open('ps.nc', nf90_nowrite, ncidps) 1769 IF (rcode/=nf90_noerr) THEN 1770 abort_message='Nudging: error -> no file ps.nc' 1771 CALL abort_gcm(modname,abort_message,1) 1772 ENDIF 1773 rcode = nf90_inq_varid(ncidps, 'SP', varidps) 1774 IF (rcode/=nf90_noerr) THEN 1775 abort_message='Nudging: error -> no SP variable in file ps.nc' 1776 CALL abort_gcm(modname,abort_message,1) 1777 ENDIF 1778 WRITE(*,*) trim(modname)//' ncidps,varidps',ncidps,varidps 1779 endif 1780 ! Coordonnee verticale 1781 if (guide_plevs==0) THEN 1782 rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl) 1783 IF (rcode/=0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl) 1784 WRITE(*,*) trim(modname)//' ncidpl,varidpl',ncidpl,varidpl 1785 endif 1786 ! Coefs ap, bp pour calcul de la pression aux differents niveaux 1787 IF (guide_plevs==1) THEN 1788 status=nf90_put_var(ncidpl,varidap,apnc,[1],[nlevnc]) 1789 status=nf90_put_var(ncidpl,varidbp,bpnc,[1],[nlevnc]) 1790 ELSEIF (guide_plevs==0) THEN 1791 status=nf90_put_var(ncidpl,varidpl,apnc,[1],[nlevnc]) 1792 !FC Pour les corrections la pression est deja en Pascals on commente la ligne ci-dessous 1793 IF(convert_Pa) apnc=apnc*100.! conversion en Pascals 1794 bpnc(:)=0. 1795 ENDIF 1796 first=.FALSE. 1797 ENDIF ! (first) 1798 1799 ! ----------------------------------------------------------------- 1800 ! lecture des champs u, v, T, Q, ps 1801 ! ----------------------------------------------------------------- 1802 1803 ! dimensions pour les champs scalaires et le vent zonal 1804 start(1)=1 1805 start(2)=jjb_u 1806 start(3)=1 1807 start(4)=timestep 1808 1809 count(1)=iip1 1810 count(2)=jjnb_u 1811 count(3)=nlevnc 1812 count(4)=1 1813 1814 IF (invert_y) start(2)=jjp1-jje_u+1 1815 ! Pression 1816 if (guide_plevs==2) THEN 1817 status=nf90_put_var(ncidp,varidp,pnat2,start,count) 1818 IF (invert_y) THEN 1819 ! PRINT*,"Invertion impossible actuellement" 1820 ! CALL abort_gcm(modname,abort_message,1) 1821 CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2) 1822 ENDIF 1823 endif 1824 1825 ! Vent zonal 1826 if (guide_u) THEN 1827 status=nf90_put_var(ncidu,varidu,unat2,start,count) 1828 IF (invert_y) THEN 1829 ! PRINT*,"Invertion impossible actuellement" 1830 ! CALL abort_gcm(modname,abort_message,1) 1831 CALL invert_lat(iip1,jjnb_u,nlevnc,unat2) 1832 ENDIF 1833 1834 endif 1835 1836 1837 ! Temperature 1838 if (guide_T) THEN 1839 status=nf90_put_var(ncidt,varidt,tnat2,start,count) 1840 IF (invert_y) THEN 1841 ! PRINT*,"Invertion impossible actuellement" 1842 ! CALL abort_gcm(modname,abort_message,1) 1843 CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2) 1844 ENDIF 1845 endif 1846 1847 ! Humidite 1848 if (guide_Q) THEN 1849 status=nf90_put_var(ncidQ,varidQ,qnat2,start,count) 1850 IF (invert_y) THEN 1851 ! PRINT*,"Invertion impossible actuellement" 1852 ! CALL abort_gcm(modname,abort_message,1) 1853 CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2) 1854 ENDIF 1855 1856 endif 1857 1858 ! Vent meridien 1859 if (guide_v) THEN 1860 start(2)=jjb_v 1861 count(2)=jjnb_v 1862 IF (invert_y) start(2)=jjm-jje_v+1 1863 1864 status=nf90_put_var(ncidv,varidv,vnat2,start,count) 1865 IF (invert_y) THEN 1866 ! PRINT*,"Invertion impossible actuellement" 1867 ! CALL abort_gcm(modname,abort_message,1) 1868 CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2) 1869 ENDIF 1870 endif 1871 1872 ! Pression de surface 1873 if ((guide_P).OR.(guide_plevs==1)) THEN 1874 start(2)=jjb_u 1875 start(3)=timestep 1876 start(4)=0 1877 count(2)=jjnb_u 1878 count(3)=1 1879 count(4)=0 1880 IF (invert_y) start(2)=jjp1-jje_u+1 1881 status=nf90_put_var(ncidps,varidps,psnat2,start,count) 1882 IF (invert_y) THEN 1883 ! PRINT*,"Invertion impossible actuellement" 1884 ! CALL abort_gcm(modname,abort_message,1) 1885 CALL invert_lat(iip1,jjnb_u,1,psnat2) 1886 ENDIF 1887 endif 1570 INTEGER, INTENT(IN) :: timestep 1571 1572 LOGICAL, SAVE :: first = .TRUE. 1573 ! Identification fichiers et variables NetCDF: 1574 INTEGER, SAVE :: ncidu, varidu, ncidv, varidv, ncidp, varidp 1575 INTEGER, SAVE :: ncidQ, varidQ, ncidt, varidt, ncidps, varidps 1576 INTEGER :: ncidpl, varidpl, varidap, varidbp, dimid, lendim 1577 ! Variables auxiliaires NetCDF: 1578 INTEGER, DIMENSION(4) :: start, count 1579 INTEGER :: status, rcode 1580 CHARACTER (len = 80) :: abort_message 1581 CHARACTER (len = 20) :: modname = 'guide_read' 1582 CHARACTER (len = 20) :: namedim 1583 abort_message = 'pb in guide_read' 1584 1585 ! ----------------------------------------------------------------- 1586 ! Premier appel: initialisation de la lecture des fichiers 1587 ! ----------------------------------------------------------------- 1588 IF (first) THEN 1589 ncidpl = -99 1590 WRITE(*, *) trim(modname) // ': opening nudging files ' 1591 ! Ap et Bp si Niveaux de pression hybrides 1592 IF (guide_plevs==1) THEN 1593 WRITE(*, *) trim(modname) // ' Reading nudging on model levels' 1594 rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl) 1595 IF (rcode/=nf90_noerr) THEN 1596 abort_message = 'Nudging: error -> no file apbp.nc' 1597 CALL abort_gcm(modname, abort_message, 1) 1598 ENDIF 1599 rcode = nf90_inq_varid(ncidpl, 'AP', varidap) 1600 IF (rcode/=nf90_noerr) THEN 1601 abort_message = 'Nudging: error -> no AP variable in file apbp.nc' 1602 CALL abort_gcm(modname, abort_message, 1) 1603 ENDIF 1604 rcode = nf90_inq_varid(ncidpl, 'BP', varidbp) 1605 IF (rcode/=nf90_noerr) THEN 1606 abort_message = 'Nudging: error -> no BP variable in file apbp.nc' 1607 CALL abort_gcm(modname, abort_message, 1) 1608 ENDIF 1609 WRITE(*, *) trim(modname) // ' ncidpl,varidap', ncidpl, varidap 1610 endif 1611 1612 ! Pression si guidage sur niveaux P variables 1613 IF (guide_plevs==2) THEN 1614 rcode = nf90_open('P.nc', nf90_nowrite, ncidp) 1615 IF (rcode/=nf90_noerr) THEN 1616 abort_message = 'Nudging: error -> no file P.nc' 1617 CALL abort_gcm(modname, abort_message, 1) 1618 ENDIF 1619 rcode = nf90_inq_varid(ncidp, 'PRES', varidp) 1620 IF (rcode/=nf90_noerr) THEN 1621 abort_message = 'Nudging: error -> no PRES variable in file P.nc' 1622 CALL abort_gcm(modname, abort_message, 1) 1623 ENDIF 1624 WRITE(*, *) trim(modname) // ' ncidp,varidp', ncidp, varidp 1625 IF (ncidpl==-99) ncidpl = ncidp 1626 endif 1627 1628 ! Vent zonal 1629 IF (guide_u) THEN 1630 rcode = nf90_open('u.nc', nf90_nowrite, ncidu) 1631 IF (rcode/=nf90_noerr) THEN 1632 abort_message = 'Nudging: error -> no file u.nc' 1633 CALL abort_gcm(modname, abort_message, 1) 1634 ENDIF 1635 rcode = nf90_inq_varid(ncidu, 'UWND', varidu) 1636 IF (rcode/=nf90_noerr) THEN 1637 abort_message = 'Nudging: error -> no UWND variable in file u.nc' 1638 CALL abort_gcm(modname, abort_message, 1) 1639 ENDIF 1640 WRITE(*, *) trim(modname) // ' ncidu,varidu', ncidu, varidu 1641 IF (ncidpl==-99) ncidpl = ncidu 1642 1643 status = nf90_inq_dimid(ncidu, "LONU", dimid) 1644 status = nf90_inquire_dimension(ncidu, dimid, namedim, lendim) 1645 IF (lendim /= iip1) THEN 1646 abort_message = 'dimension LONU different from iip1 in u.nc' 1647 CALL abort_gcm(modname, abort_message, 1) 1648 ENDIF 1649 1650 status = nf90_inq_dimid(ncidu, "LATU", dimid) 1651 status = nf90_inquire_dimension(ncidu, dimid, namedim, lendim) 1652 IF (lendim /= jjp1) THEN 1653 abort_message = 'dimension LATU different from jjp1 in u.nc' 1654 CALL abort_gcm(modname, abort_message, 1) 1655 ENDIF 1656 1657 endif 1658 1659 ! Vent meridien 1660 IF (guide_v) THEN 1661 rcode = nf90_open('v.nc', nf90_nowrite, ncidv) 1662 IF (rcode/=nf90_noerr) THEN 1663 abort_message = 'Nudging: error -> no file v.nc' 1664 CALL abort_gcm(modname, abort_message, 1) 1665 ENDIF 1666 rcode = nf90_inq_varid(ncidv, 'VWND', varidv) 1667 IF (rcode/=nf90_noerr) THEN 1668 abort_message = 'Nudging: error -> no VWND variable in file v.nc' 1669 CALL abort_gcm(modname, abort_message, 1) 1670 ENDIF 1671 WRITE(*, *) trim(modname) // ' ncidv,varidv', ncidv, varidv 1672 IF (ncidpl==-99) ncidpl = ncidv 1673 1674 status = nf90_inq_dimid(ncidv, "LONV", dimid) 1675 status = nf90_inquire_dimension(ncidv, dimid, namedim, lendim) 1676 1677 IF (lendim /= iip1) THEN 1678 abort_message = 'dimension LONV different from iip1 in v.nc' 1679 CALL abort_gcm(modname, abort_message, 1) 1680 ENDIF 1681 1682 status = nf90_inq_dimid(ncidv, "LATV", dimid) 1683 status = nf90_inquire_dimension(ncidv, dimid, namedim, lendim) 1684 IF (lendim /= jjm) THEN 1685 abort_message = 'dimension LATV different from jjm in v.nc' 1686 CALL abort_gcm(modname, abort_message, 1) 1687 ENDIF 1688 1689 endif 1690 1691 ! Temperature 1692 IF (guide_T) THEN 1693 rcode = nf90_open('T.nc', nf90_nowrite, ncidt) 1694 IF (rcode/=nf90_noerr) THEN 1695 abort_message = 'Nudging: error -> no file T.nc' 1696 CALL abort_gcm(modname, abort_message, 1) 1697 ENDIF 1698 rcode = nf90_inq_varid(ncidt, 'AIR', varidt) 1699 IF (rcode/=nf90_noerr) THEN 1700 abort_message = 'Nudging: error -> no AIR variable in file T.nc' 1701 CALL abort_gcm(modname, abort_message, 1) 1702 ENDIF 1703 WRITE(*, *) trim(modname) // ' ncidT,varidT', ncidt, varidt 1704 IF (ncidpl==-99) ncidpl = ncidt 1705 1706 status = nf90_inq_dimid(ncidt, "LONV", dimid) 1707 status = nf90_inquire_dimension(ncidt, dimid, namedim, lendim) 1708 IF (lendim /= iip1) THEN 1709 abort_message = 'dimension LONV different from iip1 in T.nc' 1710 CALL abort_gcm(modname, abort_message, 1) 1711 ENDIF 1712 1713 status = nf90_inq_dimid(ncidt, "LATU", dimid) 1714 status = nf90_inquire_dimension(ncidt, dimid, namedim, lendim) 1715 IF (lendim /= jjp1) THEN 1716 abort_message = 'dimension LATU different from jjp1 in T.nc' 1717 CALL abort_gcm(modname, abort_message, 1) 1718 ENDIF 1719 1720 endif 1721 1722 ! Humidite 1723 IF (guide_Q) THEN 1724 rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ) 1725 IF (rcode/=nf90_noerr) THEN 1726 abort_message = 'Nudging: error -> no file hur.nc' 1727 CALL abort_gcm(modname, abort_message, 1) 1728 ENDIF 1729 rcode = nf90_inq_varid(ncidQ, 'RH', varidQ) 1730 IF (rcode/=nf90_noerr) THEN 1731 abort_message = 'Nudging: error -> no RH variable in file hur.nc' 1732 CALL abort_gcm(modname, abort_message, 1) 1733 ENDIF 1734 WRITE(*, *) trim(modname) // ' ncidQ,varidQ', ncidQ, varidQ 1735 IF (ncidpl==-99) ncidpl = ncidQ 1736 1737 status = nf90_inq_dimid(ncidQ, "LONV", dimid) 1738 status = nf90_inquire_dimension(ncidQ, dimid, namedim, lendim) 1739 IF (lendim /= iip1) THEN 1740 abort_message = 'dimension LONV different from iip1 in hur.nc' 1741 CALL abort_gcm(modname, abort_message, 1) 1742 ENDIF 1743 1744 status = nf90_inq_dimid(ncidQ, "LATU", dimid) 1745 status = nf90_inquire_dimension(ncidQ, dimid, namedim, lendim) 1746 IF (lendim /= jjp1) THEN 1747 abort_message = 'dimension LATU different from jjp1 in hur.nc' 1748 CALL abort_gcm(modname, abort_message, 1) 1749 ENDIF 1750 1751 endif 1752 ! Pression de surface 1753 IF ((guide_P).OR.(guide_plevs==1)) THEN 1754 rcode = nf90_open('ps.nc', nf90_nowrite, ncidps) 1755 IF (rcode/=nf90_noerr) THEN 1756 abort_message = 'Nudging: error -> no file ps.nc' 1757 CALL abort_gcm(modname, abort_message, 1) 1758 ENDIF 1759 rcode = nf90_inq_varid(ncidps, 'SP', varidps) 1760 IF (rcode/=nf90_noerr) THEN 1761 abort_message = 'Nudging: error -> no SP variable in file ps.nc' 1762 CALL abort_gcm(modname, abort_message, 1) 1763 ENDIF 1764 WRITE(*, *) trim(modname) // ' ncidps,varidps', ncidps, varidps 1765 endif 1766 ! Coordonnee verticale 1767 IF (guide_plevs==0) THEN 1768 rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl) 1769 IF (rcode/=0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl) 1770 WRITE(*, *) trim(modname) // ' ncidpl,varidpl', ncidpl, varidpl 1771 endif 1772 ! Coefs ap, bp pour calcul de la pression aux differents niveaux 1773 IF (guide_plevs==1) THEN 1774 status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc]) 1775 status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc]) 1776 ELSEIF (guide_plevs==0) THEN 1777 status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc]) 1778 !FC Pour les corrections la pression est deja en Pascals on commente la ligne ci-dessous 1779 IF(convert_Pa) apnc = apnc * 100.! conversion en Pascals 1780 bpnc(:) = 0. 1781 ENDIF 1782 first = .FALSE. 1783 ENDIF ! (first) 1784 1785 ! ----------------------------------------------------------------- 1786 ! lecture des champs u, v, T, Q, ps 1787 ! ----------------------------------------------------------------- 1788 1789 ! dimensions pour les champs scalaires et le vent zonal 1790 start(1) = 1 1791 start(2) = jjb_u 1792 start(3) = 1 1793 start(4) = timestep 1794 1795 count(1) = iip1 1796 count(2) = jjnb_u 1797 count(3) = nlevnc 1798 count(4) = 1 1799 1800 IF (invert_y) start(2) = jjp1 - jje_u + 1 1801 ! Pression 1802 IF (guide_plevs==2) THEN 1803 status = nf90_put_var(ncidp, varidp, pnat2, start, count) 1804 IF (invert_y) THEN 1805 ! PRINT*,"Invertion impossible actuellement" 1806 ! CALL abort_gcm(modname,abort_message,1) 1807 CALL invert_lat(iip1, jjnb_u, nlevnc, pnat2) 1808 ENDIF 1809 endif 1810 1811 ! Vent zonal 1812 IF (guide_u) THEN 1813 status = nf90_put_var(ncidu, varidu, unat2, start, count) 1814 IF (invert_y) THEN 1815 ! PRINT*,"Invertion impossible actuellement" 1816 ! CALL abort_gcm(modname,abort_message,1) 1817 CALL invert_lat(iip1, jjnb_u, nlevnc, unat2) 1818 ENDIF 1819 1820 endif 1821 1822 1823 ! Temperature 1824 IF (guide_T) THEN 1825 status = nf90_put_var(ncidt, varidt, tnat2, start, count) 1826 IF (invert_y) THEN 1827 ! PRINT*,"Invertion impossible actuellement" 1828 ! CALL abort_gcm(modname,abort_message,1) 1829 CALL invert_lat(iip1, jjnb_u, nlevnc, tnat2) 1830 ENDIF 1831 endif 1832 1833 ! Humidite 1834 IF (guide_Q) THEN 1835 status = nf90_put_var(ncidQ, varidQ, qnat2, start, count) 1836 IF (invert_y) THEN 1837 ! PRINT*,"Invertion impossible actuellement" 1838 ! CALL abort_gcm(modname,abort_message,1) 1839 CALL invert_lat(iip1, jjnb_u, nlevnc, qnat2) 1840 ENDIF 1841 1842 endif 1843 1844 ! Vent meridien 1845 IF (guide_v) THEN 1846 start(2) = jjb_v 1847 count(2) = jjnb_v 1848 IF (invert_y) start(2) = jjm - jje_v + 1 1849 1850 status = nf90_put_var(ncidv, varidv, vnat2, start, count) 1851 IF (invert_y) THEN 1852 ! PRINT*,"Invertion impossible actuellement" 1853 ! CALL abort_gcm(modname,abort_message,1) 1854 CALL invert_lat(iip1, jjnb_v, nlevnc, vnat2) 1855 ENDIF 1856 endif 1857 1858 ! Pression de surface 1859 IF ((guide_P).OR.(guide_plevs==1)) THEN 1860 start(2) = jjb_u 1861 start(3) = timestep 1862 start(4) = 0 1863 count(2) = jjnb_u 1864 count(3) = 1 1865 count(4) = 0 1866 IF (invert_y) start(2) = jjp1 - jje_u + 1 1867 status = nf90_put_var(ncidps, varidps, psnat2, start, count) 1868 IF (invert_y) THEN 1869 ! PRINT*,"Invertion impossible actuellement" 1870 ! CALL abort_gcm(modname,abort_message,1) 1871 CALL invert_lat(iip1, jjnb_u, 1, psnat2) 1872 ENDIF 1873 endif 1888 1874 1889 1875 END SUBROUTINE guide_read 1890 1876 1891 !=======================================================================1877 !======================================================================= 1892 1878 SUBROUTINE guide_read2D(timestep) 1893 1879 … … 1897 1883 include "paramet.h" 1898 1884 1899 INTEGER, INTENT(IN) 1900 1901 LOGICAL, SAVE :: first=.TRUE.1902 ! Identification fichiers et variables NetCDF:1903 INTEGER, SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp1904 INTEGER, SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps1905 INTEGER :: ncidpl,varidpl,varidap,varidbp1906 ! Variables auxiliaires NetCDF:1907 INTEGER, DIMENSION(4) :: start, count1908 INTEGER :: status,rcode1909 ! Variables for 3D extension:1910 REAL, DIMENSION (jjb_u:jje_u, llm):: zu1911 REAL, DIMENSION (jjb_v:jje_v, llm):: zv1912 INTEGER 1913 CHARACTER (len = 80) 1914 CHARACTER (len = 20) 1915 abort_message ='pb in guide_read2D'1916 1917 ! -----------------------------------------------------------------1918 ! Premier appel: initialisation de la lecture des fichiers1919 ! -----------------------------------------------------------------1920 if(first) THEN1921 ncidpl=-991922 WRITE(*,*)trim(modname)//' : opening nudging files '1923 ! Ap et Bp si niveaux de pression hybrides1924 if(guide_plevs==1) THEN1925 WRITE(*,*)trim(modname)//' Reading nudging on model levels'1926 1927 1928 abort_message='Nudging: error -> no file apbp.nc'1929 CALL abort_gcm(modname,abort_message,1)1930 1931 1932 1933 abort_message='Nudging: error -> no AP variable in file apbp.nc'1934 CALL abort_gcm(modname,abort_message,1)1935 1936 1937 1938 abort_message='Nudging: error -> no BP variable in file apbp.nc'1939 CALL abort_gcm(modname,abort_message,1)1940 1941 WRITE(*,*)trim(modname)//'ncidpl,varidap',ncidpl,varidap1942 1943 ! Pression1944 if(guide_plevs==2) THEN1945 1946 1947 abort_message='Nudging: error -> no file P.nc'1948 CALL abort_gcm(modname,abort_message,1)1949 1950 1951 1952 abort_message='Nudging: error -> no PRES variable in file P.nc'1953 CALL abort_gcm(modname,abort_message,1)1954 1955 WRITE(*,*)trim(modname)//' ncidp,varidp',ncidp,varidp1956 if (ncidpl==-99) ncidpl=ncidp1957 1958 ! Vent zonal1959 if(guide_u) THEN1960 1961 1962 abort_message='Nudging: error -> no file u.nc'1963 CALL abort_gcm(modname,abort_message,1)1964 1965 1966 1967 abort_message='Nudging: error -> no UWND variable in file u.nc'1968 CALL abort_gcm(modname,abort_message,1)1969 1970 WRITE(*,*)trim(modname)//' ncidu,varidu',ncidu,varidu1971 if (ncidpl==-99) ncidpl=ncidu1972 1973 1974 ! Vent meridien1975 if(guide_v) THEN1976 1977 1978 abort_message='Nudging: error -> no file v.nc'1979 CALL abort_gcm(modname,abort_message,1)1980 1981 1982 1983 abort_message='Nudging: error -> no VWND variable in file v.nc'1984 CALL abort_gcm(modname,abort_message,1)1985 1986 WRITE(*,*)trim(modname)//' ncidv,varidv',ncidv,varidv1987 if (ncidpl==-99) ncidpl=ncidv1988 1989 ! Temperature1990 if(guide_T) THEN1991 1992 1993 abort_message='Nudging: error -> no file T.nc'1994 CALL abort_gcm(modname,abort_message,1)1995 1996 1997 1998 abort_message='Nudging: error -> no AIR variable in file T.nc'1999 CALL abort_gcm(modname,abort_message,1)2000 2001 WRITE(*,*)trim(modname)//' ncidT,varidT',ncidt,varidt2002 if (ncidpl==-99) ncidpl=ncidt2003 2004 ! Humidite2005 if(guide_Q) THEN2006 2007 2008 abort_message='Nudging: error -> no file hur.nc'2009 CALL abort_gcm(modname,abort_message,1)2010 2011 2012 2013 abort_message='Nudging: error -> no RH,variable in file hur.nc'2014 CALL abort_gcm(modname,abort_message,1)2015 2016 WRITE(*,*)trim(modname)//' ncidQ,varidQ',ncidQ,varidQ2017 if (ncidpl==-99) ncidpl=ncidQ2018 2019 ! Pression de surface2020 if((guide_P).OR.(guide_plevs==1)) THEN2021 2022 2023 abort_message='Nudging: error -> no file ps.nc'2024 CALL abort_gcm(modname,abort_message,1)2025 2026 2027 2028 abort_message='Nudging: error -> no SP variable in file ps.nc'2029 CALL abort_gcm(modname,abort_message,1)2030 2031 WRITE(*,*)trim(modname)//' ncidps,varidps',ncidps,varidps2032 2033 ! Coordonnee verticale2034 if(guide_plevs==0) THEN2035 2036 2037 WRITE(*,*)trim(modname)//' ncidpl,varidpl',ncidpl,varidpl2038 2039 ! Coefs ap, bp pour calcul de la pression aux differents niveaux2040 if(guide_plevs==1) THEN2041 status=nf90_put_var(ncidpl,varidap,apnc,[1],[nlevnc])2042 status=nf90_put_var(ncidpl,varidbp,bpnc,[1],[nlevnc])2043 2044 status=nf90_put_var(ncidpl,varidpl,apnc,[1],[nlevnc])2045 apnc=apnc*100.! conversion en Pascals2046 bpnc(:)=0.2047 2048 first=.FALSE.2049 2050 2051 ! -----------------------------------------------------------------2052 ! lecture des champs u, v, T, Q, ps2053 ! -----------------------------------------------------------------2054 2055 ! dimensions pour les champs scalaires et le vent zonal2056 start(1)=12057 start(2)=jjb_u2058 start(3)=12059 start(4)=timestep2060 2061 count(1)=12062 count(2)=jjnb_u2063 count(3)=nlevnc2064 count(4)=12065 2066 IF (invert_y) start(2)=jjp1-jje_u+12067 ! Pression2068 if(guide_plevs==2) THEN2069 status=nf90_put_var(ncidp,varidp,zu,start,count)2070 DO i=1,iip12071 pnat2(i,:,:)=zu(:,:)2072 2073 2074 2075 ! PRINT*,"Invertion impossible actuellement"2076 ! CALL abort_gcm(modname,abort_message,1)2077 CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)2078 2079 2080 ! Vent zonal2081 if(guide_u) THEN2082 status=nf90_put_var(ncidu,varidu,zu,start,count)2083 DO i=1,iip12084 unat2(i,:,:)=zu(:,:)2085 2086 2087 2088 ! PRINT*,"Invertion impossible actuellement"2089 ! CALL abort_gcm(modname,abort_message,1)2090 CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)2091 2092 2093 2094 2095 ! Temperature2096 if(guide_T) THEN2097 status=nf90_put_var(ncidt,varidt,zu,start,count)2098 DO i=1,iip12099 tnat2(i,:,:)=zu(:,:)2100 2101 2102 2103 ! PRINT*,"Invertion impossible actuellement"2104 ! CALL abort_gcm(modname,abort_message,1)2105 CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)2106 2107 2108 2109 ! Humidite2110 if(guide_Q) THEN2111 status=nf90_put_var(ncidQ,varidQ,zu,start,count)2112 DO i=1,iip12113 qnat2(i,:,:)=zu(:,:)2114 2115 2116 2117 ! PRINT*,"Invertion impossible actuellement"2118 ! CALL abort_gcm(modname,abort_message,1)2119 CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)2120 2121 2122 2123 ! Vent meridien2124 if(guide_v) THEN2125 start(2)=jjb_v2126 count(2)=jjnb_v2127 IF (invert_y) start(2)=jjm-jje_v+12128 status=nf90_put_var(ncidv,varidv,zv,start,count)2129 DO i=1,iip12130 vnat2(i,:,:)=zv(:,:)2131 2132 2133 2134 2135 ! PRINT*,"Invertion impossible actuellement"2136 ! CALL abort_gcm(modname,abort_message,1)2137 CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)2138 2139 2140 2141 ! Pression de surface2142 if((guide_P).OR.(guide_plevs==1)) THEN2143 start(2)=jjb_u2144 start(3)=timestep2145 start(4)=02146 count(2)=jjnb_u2147 count(3)=12148 count(4)=02149 IF (invert_y) start(2)=jjp1-jje_u+12150 status=nf90_put_var(ncidps,varidps,zu(:,1),start,count)2151 DO i=1,iip12152 psnat2(i,:)=zu(:,1)2153 2154 2155 2156 ! PRINT*,"Invertion impossible actuellement"2157 ! CALL abort_gcm(modname,abort_message,1)2158 CALL invert_lat(iip1,jjnb_u,1,psnat2)2159 2160 1885 INTEGER, INTENT(IN) :: timestep 1886 1887 LOGICAL, SAVE :: first = .TRUE. 1888 ! Identification fichiers et variables NetCDF: 1889 INTEGER, SAVE :: ncidu, varidu, ncidv, varidv, ncidp, varidp 1890 INTEGER, SAVE :: ncidQ, varidQ, ncidt, varidt, ncidps, varidps 1891 INTEGER :: ncidpl, varidpl, varidap, varidbp 1892 ! Variables auxiliaires NetCDF: 1893 INTEGER, DIMENSION(4) :: start, count 1894 INTEGER :: status, rcode 1895 ! Variables for 3D extension: 1896 REAL, DIMENSION (jjb_u:jje_u, llm) :: zu 1897 REAL, DIMENSION (jjb_v:jje_v, llm) :: zv 1898 INTEGER :: i 1899 CHARACTER (len = 80) :: abort_message 1900 CHARACTER (len = 20) :: modname = 'guide_read2D' 1901 abort_message = 'pb in guide_read2D' 1902 1903 ! ----------------------------------------------------------------- 1904 ! Premier appel: initialisation de la lecture des fichiers 1905 ! ----------------------------------------------------------------- 1906 IF (first) THEN 1907 ncidpl = -99 1908 WRITE(*, *)trim(modname) // ' : opening nudging files ' 1909 ! Ap et Bp si niveaux de pression hybrides 1910 IF (guide_plevs==1) THEN 1911 WRITE(*, *)trim(modname) // ' Reading nudging on model levels' 1912 rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl) 1913 IF (rcode/=nf90_noerr) THEN 1914 abort_message = 'Nudging: error -> no file apbp.nc' 1915 CALL abort_gcm(modname, abort_message, 1) 1916 ENDIF 1917 rcode = nf90_inq_varid(ncidpl, 'AP', varidap) 1918 IF (rcode/=nf90_noerr) THEN 1919 abort_message = 'Nudging: error -> no AP variable in file apbp.nc' 1920 CALL abort_gcm(modname, abort_message, 1) 1921 ENDIF 1922 rcode = nf90_inq_varid(ncidpl, 'BP', varidbp) 1923 IF (rcode/=nf90_noerr) THEN 1924 abort_message = 'Nudging: error -> no BP variable in file apbp.nc' 1925 CALL abort_gcm(modname, abort_message, 1) 1926 ENDIF 1927 WRITE(*, *)trim(modname) // 'ncidpl,varidap', ncidpl, varidap 1928 endif 1929 ! Pression 1930 IF (guide_plevs==2) THEN 1931 rcode = nf90_open('P.nc', nf90_nowrite, ncidp) 1932 IF (rcode/=nf90_noerr) THEN 1933 abort_message = 'Nudging: error -> no file P.nc' 1934 CALL abort_gcm(modname, abort_message, 1) 1935 ENDIF 1936 rcode = nf90_inq_varid(ncidp, 'PRES', varidp) 1937 IF (rcode/=nf90_noerr) THEN 1938 abort_message = 'Nudging: error -> no PRES variable in file P.nc' 1939 CALL abort_gcm(modname, abort_message, 1) 1940 ENDIF 1941 WRITE(*, *)trim(modname) // ' ncidp,varidp', ncidp, varidp 1942 IF (ncidpl==-99) ncidpl = ncidp 1943 endif 1944 ! Vent zonal 1945 IF (guide_u) THEN 1946 rcode = nf90_open('u.nc', nf90_nowrite, ncidu) 1947 IF (rcode/=nf90_noerr) THEN 1948 abort_message = 'Nudging: error -> no file u.nc' 1949 CALL abort_gcm(modname, abort_message, 1) 1950 ENDIF 1951 rcode = nf90_inq_varid(ncidu, 'UWND', varidu) 1952 IF (rcode/=nf90_noerr) THEN 1953 abort_message = 'Nudging: error -> no UWND variable in file u.nc' 1954 CALL abort_gcm(modname, abort_message, 1) 1955 ENDIF 1956 WRITE(*, *)trim(modname) // ' ncidu,varidu', ncidu, varidu 1957 IF (ncidpl==-99) ncidpl = ncidu 1958 endif 1959 1960 ! Vent meridien 1961 IF (guide_v) THEN 1962 rcode = nf90_open('v.nc', nf90_nowrite, ncidv) 1963 IF (rcode/=nf90_noerr) THEN 1964 abort_message = 'Nudging: error -> no file v.nc' 1965 CALL abort_gcm(modname, abort_message, 1) 1966 ENDIF 1967 rcode = nf90_inq_varid(ncidv, 'VWND', varidv) 1968 IF (rcode/=nf90_noerr) THEN 1969 abort_message = 'Nudging: error -> no VWND variable in file v.nc' 1970 CALL abort_gcm(modname, abort_message, 1) 1971 ENDIF 1972 WRITE(*, *)trim(modname) // ' ncidv,varidv', ncidv, varidv 1973 IF (ncidpl==-99) ncidpl = ncidv 1974 endif 1975 ! Temperature 1976 IF (guide_T) THEN 1977 rcode = nf90_open('T.nc', nf90_nowrite, ncidt) 1978 IF (rcode/=nf90_noerr) THEN 1979 abort_message = 'Nudging: error -> no file T.nc' 1980 CALL abort_gcm(modname, abort_message, 1) 1981 ENDIF 1982 rcode = nf90_inq_varid(ncidt, 'AIR', varidt) 1983 IF (rcode/=nf90_noerr) THEN 1984 abort_message = 'Nudging: error -> no AIR variable in file T.nc' 1985 CALL abort_gcm(modname, abort_message, 1) 1986 ENDIF 1987 WRITE(*, *)trim(modname) // ' ncidT,varidT', ncidt, varidt 1988 IF (ncidpl==-99) ncidpl = ncidt 1989 endif 1990 ! Humidite 1991 IF (guide_Q) THEN 1992 rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ) 1993 IF (rcode/=nf90_noerr) THEN 1994 abort_message = 'Nudging: error -> no file hur.nc' 1995 CALL abort_gcm(modname, abort_message, 1) 1996 ENDIF 1997 rcode = nf90_inq_varid(ncidQ, 'RH', varidQ) 1998 IF (rcode/=nf90_noerr) THEN 1999 abort_message = 'Nudging: error -> no RH,variable in file hur.nc' 2000 CALL abort_gcm(modname, abort_message, 1) 2001 ENDIF 2002 WRITE(*, *)trim(modname) // ' ncidQ,varidQ', ncidQ, varidQ 2003 IF (ncidpl==-99) ncidpl = ncidQ 2004 endif 2005 ! Pression de surface 2006 IF ((guide_P).OR.(guide_plevs==1)) THEN 2007 rcode = nf90_open('ps.nc', nf90_nowrite, ncidps) 2008 IF (rcode/=nf90_noerr) THEN 2009 abort_message = 'Nudging: error -> no file ps.nc' 2010 CALL abort_gcm(modname, abort_message, 1) 2011 ENDIF 2012 rcode = nf90_inq_varid(ncidps, 'SP', varidps) 2013 IF (rcode/=nf90_noerr) THEN 2014 abort_message = 'Nudging: error -> no SP variable in file ps.nc' 2015 CALL abort_gcm(modname, abort_message, 1) 2016 ENDIF 2017 WRITE(*, *)trim(modname) // ' ncidps,varidps', ncidps, varidps 2018 endif 2019 ! Coordonnee verticale 2020 IF (guide_plevs==0) THEN 2021 rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl) 2022 IF (rcode/=0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl) 2023 WRITE(*, *)trim(modname) // ' ncidpl,varidpl', ncidpl, varidpl 2024 endif 2025 ! Coefs ap, bp pour calcul de la pression aux differents niveaux 2026 IF (guide_plevs==1) THEN 2027 status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc]) 2028 status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc]) 2029 elseif (guide_plevs==0) THEN 2030 status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc]) 2031 apnc = apnc * 100.! conversion en Pascals 2032 bpnc(:) = 0. 2033 endif 2034 first = .FALSE. 2035 endif ! (first) 2036 2037 ! ----------------------------------------------------------------- 2038 ! lecture des champs u, v, T, Q, ps 2039 ! ----------------------------------------------------------------- 2040 2041 ! dimensions pour les champs scalaires et le vent zonal 2042 start(1) = 1 2043 start(2) = jjb_u 2044 start(3) = 1 2045 start(4) = timestep 2046 2047 count(1) = 1 2048 count(2) = jjnb_u 2049 count(3) = nlevnc 2050 count(4) = 1 2051 2052 IF (invert_y) start(2) = jjp1 - jje_u + 1 2053 ! Pression 2054 IF (guide_plevs==2) THEN 2055 status = nf90_put_var(ncidp, varidp, zu, start, count) 2056 DO i = 1, iip1 2057 pnat2(i, :, :) = zu(:, :) 2058 ENDDO 2059 2060 IF (invert_y) THEN 2061 ! PRINT*,"Invertion impossible actuellement" 2062 ! CALL abort_gcm(modname,abort_message,1) 2063 CALL invert_lat(iip1, jjnb_u, nlevnc, pnat2) 2064 ENDIF 2065 endif 2066 ! Vent zonal 2067 IF (guide_u) THEN 2068 status = nf90_put_var(ncidu, varidu, zu, start, count) 2069 DO i = 1, iip1 2070 unat2(i, :, :) = zu(:, :) 2071 ENDDO 2072 2073 IF (invert_y) THEN 2074 ! PRINT*,"Invertion impossible actuellement" 2075 ! CALL abort_gcm(modname,abort_message,1) 2076 CALL invert_lat(iip1, jjnb_u, nlevnc, unat2) 2077 ENDIF 2078 endif 2079 2080 2081 ! Temperature 2082 IF (guide_T) THEN 2083 status = nf90_put_var(ncidt, varidt, zu, start, count) 2084 DO i = 1, iip1 2085 tnat2(i, :, :) = zu(:, :) 2086 ENDDO 2087 2088 IF (invert_y) THEN 2089 ! PRINT*,"Invertion impossible actuellement" 2090 ! CALL abort_gcm(modname,abort_message,1) 2091 CALL invert_lat(iip1, jjnb_u, nlevnc, tnat2) 2092 ENDIF 2093 endif 2094 2095 ! Humidite 2096 IF (guide_Q) THEN 2097 status = nf90_put_var(ncidQ, varidQ, zu, start, count) 2098 DO i = 1, iip1 2099 qnat2(i, :, :) = zu(:, :) 2100 ENDDO 2101 2102 IF (invert_y) THEN 2103 ! PRINT*,"Invertion impossible actuellement" 2104 ! CALL abort_gcm(modname,abort_message,1) 2105 CALL invert_lat(iip1, jjnb_u, nlevnc, qnat2) 2106 ENDIF 2107 endif 2108 2109 ! Vent meridien 2110 IF (guide_v) THEN 2111 start(2) = jjb_v 2112 count(2) = jjnb_v 2113 IF (invert_y) start(2) = jjm - jje_v + 1 2114 status = nf90_put_var(ncidv, varidv, zv, start, count) 2115 DO i = 1, iip1 2116 vnat2(i, :, :) = zv(:, :) 2117 ENDDO 2118 2119 IF (invert_y) THEN 2120 2121 ! PRINT*,"Invertion impossible actuellement" 2122 ! CALL abort_gcm(modname,abort_message,1) 2123 CALL invert_lat(iip1, jjnb_v, nlevnc, vnat2) 2124 ENDIF 2125 endif 2126 2127 ! Pression de surface 2128 IF ((guide_P).OR.(guide_plevs==1)) THEN 2129 start(2) = jjb_u 2130 start(3) = timestep 2131 start(4) = 0 2132 count(2) = jjnb_u 2133 count(3) = 1 2134 count(4) = 0 2135 IF (invert_y) start(2) = jjp1 - jje_u + 1 2136 status = nf90_put_var(ncidps, varidps, zu(:, 1), start, count) 2137 DO i = 1, iip1 2138 psnat2(i, :) = zu(:, 1) 2139 ENDDO 2140 2141 IF (invert_y) THEN 2142 ! PRINT*,"Invertion impossible actuellement" 2143 ! CALL abort_gcm(modname,abort_message,1) 2144 CALL invert_lat(iip1, jjnb_u, 1, psnat2) 2145 ENDIF 2146 endif 2161 2147 2162 2148 END SUBROUTINE guide_read2D 2163 2164 !=======================================================================2165 SUBROUTINE guide_out(varname, hsize,vsize,field_loc,factt)2149 2150 !======================================================================= 2151 SUBROUTINE guide_out(varname, hsize, vsize, field_loc, factt) 2166 2152 USE parallel_lmdz 2167 2153 USE mod_hallo, ONLY: gather_field_u, gather_field_v 2168 2154 USE comconst_mod, ONLY: pi 2169 2155 USE comvert_mod, ONLY: presnivs 2170 usenetcdf95, ONLY: nf95_def_var, nf95_put_var2156 USE netcdf95, ONLY: nf95_def_var, nf95_put_var 2171 2157 2172 2158 IMPLICIT NONE … … 2175 2161 INCLUDE "paramet.h" 2176 2162 INCLUDE "comgeom2.h" 2177 2163 2178 2164 ! Variables entree 2179 CHARACTER*(*), INTENT(IN) 2180 INTEGER, INTENT (IN) :: hsize,vsize2181 ! REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc2182 REAL, DIMENSION (:, :), INTENT(IN) :: field_loc2165 CHARACTER*(*), INTENT(IN) :: varname 2166 INTEGER, INTENT (IN) :: hsize, vsize 2167 ! REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc 2168 REAL, DIMENSION (:, :), INTENT(IN) :: field_loc 2183 2169 REAL factt 2184 2170 2185 2171 ! Variables locales 2186 INTEGER, SAVE :: timestep =02172 INTEGER, SAVE :: timestep = 0 2187 2173 ! Identites fichier netcdf 2188 INTEGER 2189 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev2190 INTEGER :: vid_au,vid_av, varid_alpha_t, varid_alpha_q2174 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev 2175 INTEGER :: vid_lonu, vid_lonv, vid_latu, vid_latv, vid_cu, vid_cv, vid_lev 2176 INTEGER :: vid_au, vid_av, varid_alpha_t, varid_alpha_q 2191 2177 INTEGER, DIMENSION (3) :: dim3 2192 INTEGER, DIMENSION (4) :: dim4, count,start2193 INTEGER :: ierr, varid,l2194 REAL zu(ip1jmp1), zv(ip1jm), zt(iip1, jjp1), zq(iip1, jjp1)2195 REAL, ALLOCATABLE, SAVE, DIMENSION(:, :,:) :: field_glo2196 CHARACTER(LEN =20),PARAMETER :: modname="guide_out"2197 2198 !$OMP MASTER2199 ALLOCATE(field_glo(iip1, hsize,vsize))2200 !$OMP END MASTER2201 !$OMP BARRIER2202 2203 ! WRITE(*,*)trim(modname)//' after allocation ',hsize,vsize2178 INTEGER, DIMENSION (4) :: dim4, count, start 2179 INTEGER :: ierr, varid, l 2180 REAL zu(ip1jmp1), zv(ip1jm), zt(iip1, jjp1), zq(iip1, jjp1) 2181 REAL, ALLOCATABLE, SAVE, DIMENSION(:, :, :) :: field_glo 2182 CHARACTER(LEN = 20), PARAMETER :: modname = "guide_out" 2183 2184 !$OMP MASTER 2185 ALLOCATE(field_glo(iip1, hsize, vsize)) 2186 !$OMP END MASTER 2187 !$OMP BARRIER 2188 2189 ! WRITE(*,*)trim(modname)//' after allocation ',hsize,vsize 2204 2190 2205 2191 IF (hsize==jjp1) THEN 2206 CALL gather_field_u(field_loc,field_glo,vsize)2192 CALL gather_field_u(field_loc, field_glo, vsize) 2207 2193 ELSE IF (hsize==jjm) THEN 2208 CALL gather_field_v(field_loc,field_glo, vsize)2209 ENDIF 2210 2211 ! WRITE(*,*)trim(modname)//' after gather '2212 CALL Gather_field_u(alpha_u, zu,1)2213 CALL Gather_field_u(alpha_t, zt,1)2214 CALL Gather_field_u(alpha_q, zq,1)2215 CALL Gather_field_v(alpha_v, zv,1)2194 CALL gather_field_v(field_loc, field_glo, vsize) 2195 ENDIF 2196 2197 ! WRITE(*,*)trim(modname)//' after gather ' 2198 CALL Gather_field_u(alpha_u, zu, 1) 2199 CALL Gather_field_u(alpha_t, zt, 1) 2200 CALL Gather_field_u(alpha_q, zq, 1) 2201 CALL Gather_field_v(alpha_v, zv, 1) 2216 2202 2217 2203 IF (mpi_rank > 0) THEN 2218 !$OMP MASTER2219 2220 !$OMP END MASTER2221 !$OMP BARRIER2222 2223 2224 ENDIF 2225 2226 !$OMP MASTER2204 !$OMP MASTER 2205 DEALLOCATE(field_glo) 2206 !$OMP END MASTER 2207 !$OMP BARRIER 2208 2209 RETURN 2210 ENDIF 2211 2212 !$OMP MASTER 2227 2213 IF (timestep==0) THEN 2228 ! ----------------------------------------------2229 ! initialisation fichier de sortie2230 ! ----------------------------------------------2231 ! Ouverture du fichier2232 ierr=nf90_create("guide_ins.nc",IOR(nf90_clobber,nf90_64bit_offset),nid)2233 ! Definition des dimensions2234 ierr=nf90_def_dim(nid,"LONU",iip1,id_lonu)2235 ierr=nf90_def_dim(nid,"LONV",iip1,id_lonv)2236 ierr=nf90_def_dim(nid,"LATU",jjp1,id_latu)2237 ierr=nf90_def_dim(nid,"LATV",jjm,id_latv)2238 ierr=nf90_def_dim(nid,"LEVEL",llm,id_lev)2239 ierr=nf90_def_dim(nid,"TIME",nf90_unlimited,id_tim)2240 2241 ! Creation des variables dimensions2242 ierr=nf90_def_var(nid,"LONU",nf90_float,id_lonu,vid_lonu)2243 ierr=nf90_def_var(nid,"LONV",nf90_float,id_lonv,vid_lonv)2244 ierr=nf90_def_var(nid,"LATU",nf90_float,id_latu,vid_latu)2245 ierr=nf90_def_var(nid,"LATV",nf90_float,id_latv,vid_latv)2246 ierr=nf90_def_var(nid,"LEVEL",nf90_float,id_lev,vid_lev)2247 ierr=nf90_def_var(nid,"cu",nf90_float,(/id_lonu,id_latu/),vid_cu)2248 ierr=nf90_def_var(nid,"cv",nf90_float,(/id_lonv,id_latv/),vid_cv)2249 ierr=nf90_def_var(nid,"au",nf90_float,(/id_lonu,id_latu/),vid_au)2250 ierr=nf90_def_var(nid,"av",nf90_float,(/id_lonv,id_latv/),vid_av)2251 2252 varid_alpha_t)2253 2254 varid_alpha_q)2255 2256 ierr=nf90_enddef(nid)2257 2258 ! Enregistrement des variables dimensions2259 ierr = nf90_put_var(nid,vid_lonu,rlonu*180./pi)2260 ierr = nf90_put_var(nid,vid_lonv,rlonv*180./pi)2261 ierr = nf90_put_var(nid,vid_latu,rlatu*180./pi)2262 ierr = nf90_put_var(nid,vid_latv,rlatv*180./pi)2263 ierr = nf90_put_var(nid,vid_lev,presnivs)2264 ierr = nf90_put_var(nid,vid_cu,cu)2265 ierr = nf90_put_var(nid,vid_cv,cv)2266 ierr = nf90_put_var(nid,vid_au,zu)2267 ierr = nf90_put_var(nid,vid_av,zv)2268 2269 2270 ! --------------------------------------------------------------------2271 ! Création des variables sauvegardées2272 ! --------------------------------------------------------------------2273 2274 ! Pressure (GCM)2275 dim4=(/id_lonv,id_latu,id_lev,id_tim/)2276 ierr = nf90_def_var(nid,"SP",nf90_float,dim4,varid)2277 ! Surface pressure (guidage)2278 2279 dim3=(/id_lonv,id_latu,id_tim/)2280 ierr = nf90_def_var(nid,"ps",nf90_float,dim3,varid)2281 2282 ! Zonal wind2283 2284 dim4=(/id_lonu,id_latu,id_lev,id_tim/)2285 ierr = nf90_def_var(nid,"u",nf90_float,dim4,varid)2286 ierr = nf90_def_var(nid,"ua",nf90_float,dim4,varid)2287 ierr = nf90_def_var(nid,"ucov",nf90_float,dim4,varid)2288 2289 ! Merid. wind2290 2291 dim4=(/id_lonv,id_latv,id_lev,id_tim/)2292 ierr = nf90_def_var(nid,"v",nf90_float,dim4,varid)2293 ierr = nf90_def_var(nid,"va",nf90_float,dim4,varid)2294 ierr = nf90_def_var(nid,"vcov",nf90_float,dim4,varid)2295 2296 ! Pot. Temperature2297 2298 dim4=(/id_lonv,id_latu,id_lev,id_tim/)2299 ierr = nf90_def_var(nid,"teta",nf90_float,dim4,varid)2300 2301 ! Specific Humidity2302 2303 dim4=(/id_lonv,id_latu,id_lev,id_tim/)2304 ierr = nf90_def_var(nid,"q",nf90_float,dim4,varid)2305 2306 2307 2308 2214 ! ---------------------------------------------- 2215 ! initialisation fichier de sortie 2216 ! ---------------------------------------------- 2217 ! Ouverture du fichier 2218 ierr = nf90_create("guide_ins.nc", IOR(nf90_clobber, nf90_64bit_offset), nid) 2219 ! Definition des dimensions 2220 ierr = nf90_def_dim(nid, "LONU", iip1, id_lonu) 2221 ierr = nf90_def_dim(nid, "LONV", iip1, id_lonv) 2222 ierr = nf90_def_dim(nid, "LATU", jjp1, id_latu) 2223 ierr = nf90_def_dim(nid, "LATV", jjm, id_latv) 2224 ierr = nf90_def_dim(nid, "LEVEL", llm, id_lev) 2225 ierr = nf90_def_dim(nid, "TIME", nf90_unlimited, id_tim) 2226 2227 ! Creation des variables dimensions 2228 ierr = nf90_def_var(nid, "LONU", nf90_float, id_lonu, vid_lonu) 2229 ierr = nf90_def_var(nid, "LONV", nf90_float, id_lonv, vid_lonv) 2230 ierr = nf90_def_var(nid, "LATU", nf90_float, id_latu, vid_latu) 2231 ierr = nf90_def_var(nid, "LATV", nf90_float, id_latv, vid_latv) 2232 ierr = nf90_def_var(nid, "LEVEL", nf90_float, id_lev, vid_lev) 2233 ierr = nf90_def_var(nid, "cu", nf90_float, (/id_lonu, id_latu/), vid_cu) 2234 ierr = nf90_def_var(nid, "cv", nf90_float, (/id_lonv, id_latv/), vid_cv) 2235 ierr = nf90_def_var(nid, "au", nf90_float, (/id_lonu, id_latu/), vid_au) 2236 ierr = nf90_def_var(nid, "av", nf90_float, (/id_lonv, id_latv/), vid_av) 2237 CALL nf95_def_var(nid, "alpha_T", nf90_float, (/id_lonv, id_latu/), & 2238 varid_alpha_t) 2239 CALL nf95_def_var(nid, "alpha_q", nf90_float, (/id_lonv, id_latu/), & 2240 varid_alpha_q) 2241 2242 ierr = nf90_enddef(nid) 2243 2244 ! Enregistrement des variables dimensions 2245 ierr = nf90_put_var(nid, vid_lonu, rlonu * 180. / pi) 2246 ierr = nf90_put_var(nid, vid_lonv, rlonv * 180. / pi) 2247 ierr = nf90_put_var(nid, vid_latu, rlatu * 180. / pi) 2248 ierr = nf90_put_var(nid, vid_latv, rlatv * 180. / pi) 2249 ierr = nf90_put_var(nid, vid_lev, presnivs) 2250 ierr = nf90_put_var(nid, vid_cu, cu) 2251 ierr = nf90_put_var(nid, vid_cv, cv) 2252 ierr = nf90_put_var(nid, vid_au, zu) 2253 ierr = nf90_put_var(nid, vid_av, zv) 2254 CALL nf95_put_var(nid, varid_alpha_t, zt) 2255 CALL nf95_put_var(nid, varid_alpha_q, zq) 2256 ! -------------------------------------------------------------------- 2257 ! Création des variables sauvegardées 2258 ! -------------------------------------------------------------------- 2259 ierr = nf90_redef(nid) 2260 ! Pressure (GCM) 2261 dim4 = (/id_lonv, id_latu, id_lev, id_tim/) 2262 ierr = nf90_def_var(nid, "SP", nf90_float, dim4, varid) 2263 ! Surface pressure (guidage) 2264 IF (guide_P) THEN 2265 dim3 = (/id_lonv, id_latu, id_tim/) 2266 ierr = nf90_def_var(nid, "ps", nf90_float, dim3, varid) 2267 ENDIF 2268 ! Zonal wind 2269 IF (guide_u) THEN 2270 dim4 = (/id_lonu, id_latu, id_lev, id_tim/) 2271 ierr = nf90_def_var(nid, "u", nf90_float, dim4, varid) 2272 ierr = nf90_def_var(nid, "ua", nf90_float, dim4, varid) 2273 ierr = nf90_def_var(nid, "ucov", nf90_float, dim4, varid) 2274 ENDIF 2275 ! Merid. wind 2276 IF (guide_v) THEN 2277 dim4 = (/id_lonv, id_latv, id_lev, id_tim/) 2278 ierr = nf90_def_var(nid, "v", nf90_float, dim4, varid) 2279 ierr = nf90_def_var(nid, "va", nf90_float, dim4, varid) 2280 ierr = nf90_def_var(nid, "vcov", nf90_float, dim4, varid) 2281 ENDIF 2282 ! Pot. Temperature 2283 IF (guide_T) THEN 2284 dim4 = (/id_lonv, id_latu, id_lev, id_tim/) 2285 ierr = nf90_def_var(nid, "teta", nf90_float, dim4, varid) 2286 ENDIF 2287 ! Specific Humidity 2288 IF (guide_Q) THEN 2289 dim4 = (/id_lonv, id_latu, id_lev, id_tim/) 2290 ierr = nf90_def_var(nid, "q", nf90_float, dim4, varid) 2291 ENDIF 2292 2293 ierr = nf90_enddef(nid) 2294 ierr = nf90_close(nid) 2309 2295 ENDIF ! timestep=0 2310 2296 2311 ! --------------------------------------------------------------------2312 ! Enregistrement du champ2313 ! --------------------------------------------------------------------2314 2315 ierr =nf90_open("guide_ins.nc",nf90_write,nid)2316 2317 IF (varname=="SP") timestep =timestep+12318 2319 ierr = nf90_inq_varid(nid, varname,varid)2297 ! -------------------------------------------------------------------- 2298 ! Enregistrement du champ 2299 ! -------------------------------------------------------------------- 2300 2301 ierr = nf90_open("guide_ins.nc", nf90_write, nid) 2302 2303 IF (varname=="SP") timestep = timestep + 1 2304 2305 ierr = nf90_inq_varid(nid, varname, varid) 2320 2306 SELECT CASE (varname) 2321 CASE ("SP", "ps")2322 start=(/1,1,1,timestep/)2323 count=(/iip1,jjp1,llm,1/)2324 CASE ("v", "va","vcov")2325 start=(/1,1,1,timestep/)2326 count=(/iip1,jjm,llm,1/)2307 CASE ("SP", "ps") 2308 start = (/1, 1, 1, timestep/) 2309 count = (/iip1, jjp1, llm, 1/) 2310 CASE ("v", "va", "vcov") 2311 start = (/1, 1, 1, timestep/) 2312 count = (/iip1, jjm, llm, 1/) 2327 2313 CASE DEFAULT 2328 start=(/1,1,1,timestep/)2329 count=(/iip1,jjp1,llm,1/)2314 start = (/1, 1, 1, timestep/) 2315 count = (/iip1, jjp1, llm, 1/) 2330 2316 END SELECT 2331 2317 2332 !$OMP END MASTER2333 !$OMP BARRIER2318 !$OMP END MASTER 2319 !$OMP BARRIER 2334 2320 2335 2321 SELECT CASE (varname) 2336 2322 2337 CASE("u", "ua")2338 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)2339 DO l=1,llm2340 field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm)2341 field_glo(:,1,l)=0. ; field_glo(:,jjp1,l)=0.2342 2343 CASE("v", "va")2344 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)2345 DO l=1,llm2346 field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:)2347 2323 CASE("u", "ua") 2324 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 2325 DO l = 1, llm 2326 field_glo(:, 2:jjm, l) = field_glo(:, 2:jjm, l) / cu(:, 2:jjm) 2327 field_glo(:, 1, l) = 0. ; field_glo(:, jjp1, l) = 0. 2328 ENDDO 2329 CASE("v", "va") 2330 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 2331 DO l = 1, llm 2332 field_glo(:, :, l) = field_glo(:, :, l) / cv(:, :) 2333 ENDDO 2348 2334 END SELECT 2349 2335 2350 ! if (varname=="ua") THEN2351 ! CALL dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ')2352 ! CALL dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ')2353 ! endif2354 2355 !$OMP MASTER2356 2357 ierr = nf90_put_var(nid, varid,field_glo,start,count)2336 ! if (varname=="ua") THEN 2337 ! CALL dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ') 2338 ! CALL dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ') 2339 ! endif 2340 2341 !$OMP MASTER 2342 2343 ierr = nf90_put_var(nid, varid, field_glo, start, count) 2358 2344 ierr = nf90_close(nid) 2359 2345 2360 2361 !$OMP END MASTER2362 !$OMP BARRIER2346 DEALLOCATE(field_glo) 2347 !$OMP END MASTER 2348 !$OMP BARRIER 2363 2349 2364 2350 END SUBROUTINE guide_out 2365 2366 2367 !===========================================================================2368 SUBROUTINE correctbid(iim, nl,x)2369 integer iim,nl2370 real x(iim+1,nl)2371 integer i,l2372 realzz2373 2374 do l =1,nl2375 do i=2,iim-12376 IF(abs(x(i,l))>1.e10) THEN2377 zz=0.5*(x(i-1,l)+x(i+1,l))2378 PRINT*,'correction ',i,l,x(i,l),zz2379 x(i,l)=zz2380 2381 2382 2351 2352 2353 !=========================================================================== 2354 SUBROUTINE correctbid(iim, nl, x) 2355 INTEGER iim, nl 2356 REAL x(iim + 1, nl) 2357 INTEGER i, l 2358 REAL zz 2359 2360 do l = 1, nl 2361 do i = 2, iim - 1 2362 IF(abs(x(i, l))>1.e10) THEN 2363 zz = 0.5 * (x(i - 1, l) + x(i + 1, l)) 2364 PRINT*, 'correction ', i, l, x(i, l), zz 2365 x(i, l) = zz 2366 endif 2367 enddo 2368 enddo 2383 2369 2384 2370 END SUBROUTINE correctbid 2385 2371 2386 2372 2387 !==================================================================== 2388 ! Ascii debug output. Could be reactivated 2389 !==================================================================== 2390 2391 SUBROUTINE dump2du(var,varname) 2392 use parallel_lmdz 2393 use mod_hallo 2394 IMPLICIT NONE 2395 include 'dimensions.h' 2396 include 'paramet.h' 2397 2398 CHARACTER (len=*) :: varname 2399 2400 2401 real, dimension(ijb_u:ije_u) :: var 2402 2403 real, dimension(ip1jmp1) :: var_glob 2373 !==================================================================== 2374 ! Ascii debug output. Could be reactivated 2375 !==================================================================== 2376 2377 SUBROUTINE dump2du(var, varname) 2378 USE parallel_lmdz 2379 USE mod_hallo 2380 IMPLICIT NONE 2381 include 'dimensions.h' 2382 include 'paramet.h' 2383 2384 CHARACTER (len = *) :: varname 2385 2386 REAL, DIMENSION(ijb_u:ije_u) :: var 2387 2388 REAL, DIMENSION(ip1jmp1) :: var_glob 2404 2389 2405 2390 RETURN 2406 2391 2407 2392 CALL barrier 2408 CALL Gather_field_u(var, var_glob,1)2393 CALL Gather_field_u(var, var_glob, 1) 2409 2394 CALL barrier 2410 2395 2411 if(mpi_rank==0) THEN2412 CALL dump2d(iip1,jjp1,var_glob,varname)2396 IF (mpi_rank==0) THEN 2397 CALL dump2d(iip1, jjp1, var_glob, varname) 2413 2398 endif 2414 2399 2415 2400 CALL barrier 2416 2401 2417 2418 END SUBROUTINE dump2du 2419 2420 !==================================================================== 2421 ! Ascii debug output. Could be reactivated 2422 !==================================================================== 2423 SUBROUTINE dumpall 2424 IMPLICIT NONE 2425 include "dimensions.h" 2426 include "paramet.h" 2427 include "comgeom.h" 2428 CALL barrier 2429 CALL dump2du(alpha_u(ijb_u:ije_u),' alpha_u couche 1') 2430 CALL dump2du(unat2(:,jjbu:jjeu,nlevnc),' unat2 couche nlevnc') 2431 CALL dump2du(ugui1(ijb_u:ije_u,1)*sqrt(unscu2(ijb_u:ije_u)),' ugui1 couche 1') 2432 2433 END SUBROUTINE dumpall 2434 2435 !=========================================================================== 2402 END SUBROUTINE dump2du 2403 2404 !==================================================================== 2405 ! Ascii debug output. Could be reactivated 2406 !==================================================================== 2407 SUBROUTINE dumpall 2408 IMPLICIT NONE 2409 include "dimensions.h" 2410 include "paramet.h" 2411 include "comgeom.h" 2412 CALL barrier 2413 CALL dump2du(alpha_u(ijb_u:ije_u), ' alpha_u couche 1') 2414 CALL dump2du(unat2(:, jjbu:jjeu, nlevnc), ' unat2 couche nlevnc') 2415 CALL dump2du(ugui1(ijb_u:ije_u, 1) * sqrt(unscu2(ijb_u:ije_u)), ' ugui1 couche 1') 2416 2417 END SUBROUTINE dumpall 2418 2419 !=========================================================================== 2436 2420 END MODULE guide_loc_mod -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/iniacademic_loc.F90
r5116 r5117 7 7 USE infotrac, ONLY: nqtot, niso, iqIsoPha, tracers, getKey, isoName 8 8 USE control_mod, ONLY: day_step,planet_type 9 useexner_hyb_m, ONLY: exner_hyb10 useexner_milieu_m, ONLY: exner_milieu9 USE exner_hyb_m, ONLY: exner_hyb 10 USE exner_milieu_m, ONLY: exner_milieu 11 11 USE parallel_lmdz, ONLY: ijb_u, ije_u, ijb_v, ije_v 12 12 USE IOIPSL, ONLY: getin 13 USE Write_Field13 USE lmdz_write_field 14 14 USE comconst_mod, ONLY: cpp, kappa, g, daysec, dtvr, pi, im, jm 15 15 USE logic_mod, ONLY: iflag_phys, read_start … … 17 17 USE temps_mod, ONLY: annee_ref, day_ini, day_ref 18 18 USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0 19 USE readTracFiles_mod, ONLY: addPhase 20 use netcdf, ONLY: nf90_nowrite,nf90_open,nf90_noerr,nf90_inq_varid,nf90_close, nf90_get_var 19 USE lmdz_readTracFiles, ONLY: addPhase 20 USE netcdf, ONLY: nf90_nowrite,nf90_open,nf90_noerr,nf90_inq_varid,nf90_close, nf90_get_var 21 USE lmdz_ran1, ONLY: ran1 21 22 22 23 ! Author: Frederic Hourdin original: 15/01/93 … … 60 61 REAL phi(ip1jmp1,llm) ! geopotentiel 61 62 REAL ddsin,zsig,tetapv,w_pv ! variables auxiliaires 62 realtetastrat ! potential temperature in the stratosphere, in K63 realtetajl(jjp1,llm)63 REAL tetastrat ! potential temperature in the stratosphere, in K 64 REAL tetajl(jjp1,llm) 64 65 INTEGER i,j,l,lsup,ij, iq, iName, iPhase, iqParent 65 66 66 67 INTEGER :: nid_relief,varid,ierr 67 real, dimension(iip1,jjp1) :: relief 68 68 REAL, DIMENSION(iip1,jjp1) :: relief 69 69 70 70 REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T … … 74 74 REAL phi_pv,dphi_pv,gam_pv,tetanoise ! Constantes pour polar vortex 75 75 76 real zz,ran177 integeridum76 REAL zz 77 INTEGER idum 78 78 79 79 REAL zdtvr, tnat, alpha_ideal … … 84 84 85 85 ! Sanity check: verify that options selected by user are not incompatible 86 if ((iflag_phys==1).and. .not. read_start) THEN86 IF ((iflag_phys==1).AND. .NOT. read_start) THEN 87 87 WRITE(lunout,*) trim(modname)," error: if read_start is set to ", & 88 88 " false then iflag_phys should not be 1" … … 90 90 " (iflag_phys >= 100)" 91 91 CALL abort_gcm(modname,"incompatible iflag_phys==1 and read_start==.FALSE.",1) 92 endif92 ENDIF 93 93 94 94 !----------------------------------------------------------------------- … … 114 114 ang0 = 0. 115 115 116 if(llm == 1) THEN116 IF (llm == 1) THEN 117 117 ! specific initializations for the shallow water case 118 118 kappa=1 119 endif119 ENDIF 120 120 121 121 CALL iniconst … … 148 148 relief=0. 149 149 ierr = nf90_open ('relief_in.nc', nf90_nowrite,nid_relief) 150 if(ierr==nf90_noerr) THEN150 IF (ierr==nf90_noerr) THEN 151 151 ierr=nf90_inq_varid(nid_relief,'RELIEF',varid) 152 if(ierr==nf90_noerr) THEN152 IF (ierr==nf90_noerr) THEN 153 153 ierr=nf90_get_var(nid_relief,varid,relief(1:iim,1:jjp1)) 154 154 relief(iip1,:)=relief(1,:) … … 173 173 174 174 CALL pression ( ip1jmp1, ap, bp, ps_glo, p ) 175 if(pressure_exner) THEN175 IF (pressure_exner) THEN 176 176 CALL exner_hyb( ip1jmp1, ps_glo, p, pks, pk ) 177 177 else … … 181 181 ENDIF 182 182 183 if(llm == 1) THEN183 IF (llm == 1) THEN 184 184 ! initialize fields for the shallow water case, if required 185 if (.not.read_start) THEN185 IF (.NOT.read_start) THEN 186 186 phis(ijb_u:ije_u)=0. 187 187 q(ijb_u:ije_u,1:llm,1:nqtot)=0 188 188 CALL sw_case_williamson91_6_loc(vcov,ucov,teta,masse,ps) 189 189 endif 190 endif190 ENDIF 191 191 192 192 academic_case: if (iflag_phys >= 2) THEN … … 258 258 tetajl(j,l)=teta0-delt_y*ddsin*ddsin+eps*ddsin & 259 259 -delt_z*(1.-ddsin*ddsin)*log(zsig) 260 if(planet_type=="giant") THEN260 IF (planet_type=="giant") THEN 261 261 tetajl(j,l)=teta0+(delt_y* & 262 262 ((sin(rlatu(j)*3.14159*eps+0.0001))**2) & … … 295 295 296 296 ! winds 297 if(ok_geost) THEN297 IF (ok_geost) THEN 298 298 CALL ugeostr(phi,ucov_glo) 299 299 else … … 303 303 304 304 ! bulk initialization of tracers 305 if(planet_type=="earth") THEN305 IF (planet_type=="earth") THEN 306 306 ! Earth: first two tracers will be water 307 307 do iq=1,nqtot … … 313 313 ! distill de Rayleigh très simplifiée 314 314 iName = tracers(iq)%iso_iName 315 if(niso <= 0 .OR. iName <= 0) CYCLE315 IF (niso <= 0 .OR. iName <= 0) CYCLE 316 316 iPhase = tracers(iq)%iso_iPhase 317 317 iqParent = tracers(iq)%iqParent 318 318 IF(tracers(iq)%iso_iZone == 0) THEN 319 if(tnat1) THEN319 IF (tnat1) THEN 320 320 tnat=1.0 321 321 alpha_ideal=1.0 … … 374 374 deallocate(phis_glo) 375 375 ENDIF ! of IF (.NOT. read_start) 376 endifacademic_case376 ENDIF academic_case 377 377 378 378 END SUBROUTINE iniacademic_loc -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/initdynav_loc.f90
r5116 r5117 7 7 USE IOIPSL 8 8 USE parallel_lmdz 9 use Write_field10 usemisc_mod9 USE lmdz_write_field 10 USE misc_mod 11 11 ! USE infotrac 12 usecom_io_dyn_mod, ONLY: histaveid,histvaveid,histuaveid, &12 USE com_io_dyn_mod, ONLY: histaveid,histvaveid,histuaveid, & 13 13 dynhistave_file,dynhistvave_file,dynhistuave_file 14 14 USE comconst_mod, ONLY: pi … … 51 51 ! Arguments 52 52 ! 53 integer(kind=4) day0, anne053 INTEGER(kind=4) day0, anne0 54 54 REAL :: tstep, t_ops, t_wrt 55 55 … … 81 81 INTEGER :: dynhistuave_domain_id 82 82 83 if(adjust) return83 IF (adjust) return 84 84 85 85 ! … … 219 219 ! Vents V 220 220 ! 221 if(pole_sud) jjn=jj_nb-1221 IF (pole_sud) jjn=jj_nb-1 222 222 CALL histdef(histvaveid, 'v', 'vent v moyen', & 223 223 'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/initfluxsto_p.f90
r5116 r5117 4 4 USE IOIPSL 5 5 USE parallel_lmdz 6 use Write_field7 usemisc_mod6 USE lmdz_write_field 7 USE misc_mod 8 8 USE comconst_mod, ONLY: pi 9 9 USE comvert_mod, ONLY: nivsigs … … 64 64 INTEGER :: ii, jj 65 65 INTEGER :: zan, idayref 66 logical:: ok_sync66 LOGICAL :: ok_sync 67 67 INTEGER :: jjb, jje, jjn 68 68 … … 136 136 jje = jj_end 137 137 jjn = jj_nb 138 if(pole_sud) jje = jj_end - 1139 if(pole_sud) jjn = jj_nb - 1138 IF (pole_sud) jje = jj_end - 1 139 IF (pole_sud) jjn = jj_nb - 1 140 140 141 141 ddid = (/ 1, 2 /) … … 156 156 rl(1, 1) = 1. 157 157 158 if(mpi_rank==0) THEN158 IF (mpi_rank==0) THEN 159 159 CALL histbeg('defstoke.nc', 1, rl, 1, rl, & 160 160 1, 1, 1, 1, & 161 161 tau0, zjulian, tstep, dhoriid, filedid) 162 162 163 endif163 ENDIF 164 164 ! 165 165 ! Appel a histhori pour rajouter les autres grilles horizontales … … 190 190 llm, nivsigs, zvertiid) 191 191 ! pour le fichier def 192 if(mpi_rank==0) THEN192 IF (mpi_rank==0) THEN 193 193 nivd(1) = 1 194 194 CALL histvert(filedid, 'sig_s', 'Niveaux sigma', & 195 195 'sigma_level', & 196 196 1, nivd, dvertiid) 197 endif197 ENDIF 198 198 ! 199 199 ! Appels a histdef pour la definition des variables a sauvegarder … … 207 207 "once", t_ops, t_wrt) 208 208 209 if(mpi_rank==0) THEN209 IF (mpi_rank==0) THEN 210 210 CALL histdef(filedid, "dtvr", "tps dyn", "s", & 211 211 1, 1, dhoriid, 1, 1, 1, -99, 32, & … … 220 220 "once", t_ops, t_wrt) 221 221 222 endif222 ENDIF 223 223 ! 224 224 ! Masse … … 237 237 ! Pbarv 238 238 ! 239 if(pole_sud) jjn = jj_nb - 1239 IF (pole_sud) jjn = jj_nb - 1 240 240 241 241 CALL histdef(filevid, 'pbarv', 'flx de masse mer', 'kg m/s', & … … 245 245 ! w 246 246 ! 247 if(pole_sud) jjn = jj_nb247 IF (pole_sud) jjn = jj_nb 248 248 CALL histdef(fileid, 'w', 'flx de masse vert', 'kg m/s', & 249 249 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & … … 269 269 CALL histend(fileid) 270 270 CALL histend(filevid) 271 if(mpi_rank==0) CALL histend(filedid)272 if(ok_sync) THEN271 IF (mpi_rank==0) CALL histend(filedid) 272 IF (ok_sync) THEN 273 273 CALL histsync(fileid) 274 274 CALL histsync(filevid) 275 if(mpi_rank==0) CALL histsync(filedid)276 endif275 IF (mpi_rank==0) CALL histsync(filedid) 276 ENDIF 277 277 278 278 END SUBROUTINE initfluxsto_p -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/inithist_loc.F90
r5116 r5117 6 6 USE IOIPSL 7 7 USE parallel_lmdz 8 USE Write_field8 USE lmdz_write_field 9 9 USE misc_mod 10 10 USE com_io_dyn_mod, ONLY: histid, histvid, histuid, & … … 78 78 INTEGER :: dynhistu_domain_id 79 79 80 if(adjust) return80 IF (adjust) return 81 81 82 82 ! … … 215 215 ! Vents V 216 216 ! 217 if(pole_sud) jjn = jj_nb - 1217 IF (pole_sud) jjn = jj_nb - 1 218 218 CALL histdef(histvid, 'v', 'vent v', & 219 219 'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/integrd_loc.f90
r5116 r5117 9 9 USE lmdz_filtreg_p 10 10 USE write_field_loc 11 USE write_field11 USE lmdz_write_field 12 12 USE integrd_mod 13 13 USE comconst_mod, ONLY: pi … … 15 15 USE comvert_mod, ONLY: ap, bp 16 16 USE temps_mod, ONLY: dt 17 USE strings_mod, ONLY: int2str17 USE lmdz_strings, ONLY: int2str 18 18 19 19 IMPLICIT NONE … … 43 43 ! ---------- 44 44 45 INTEGER, intent(in) :: nq ! number of tracers to handle in this routine45 INTEGER,INTENT(IN) :: nq ! number of tracers to handle in this routine 46 46 47 47 REAL,INTENT(INOUT) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind … … 90 90 91 91 !$OMP BARRIER 92 if(pole_nord) THEN92 IF (pole_nord) THEN 93 93 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 94 94 DO l = 1,llm … … 101 101 ENDIF 102 102 103 if(pole_sud) THEN103 IF (pole_sud) THEN 104 104 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 105 105 DO l = 1,llm … … 195 195 ! !WRITE(*,*) 'integrd 200' 196 196 !$OMP MASTER 197 if(pole_nord) THEN197 IF (pole_nord) THEN 198 198 199 199 DO ij = 1, iim … … 207 207 ENDIF 208 208 209 if(pole_sud) THEN209 IF (pole_sud) THEN 210 210 211 211 DO ij = 1, iim … … 255 255 ijb=ij_begin 256 256 ije=ij_end 257 if(pole_nord) ijb=ij_begin+iip1258 if(pole_sud) ije=ij_end-iip1257 IF (pole_nord) ijb=ij_begin+iip1 258 IF (pole_sud) ije=ij_end-iip1 259 259 260 260 DO ij = ijb,ije … … 265 265 ijb=ij_begin 266 266 ije=ij_end 267 if(pole_sud) ije=ij_end-iip1267 IF (pole_sud) ije=ij_end-iip1 268 268 269 269 DO ij = ijb,ije … … 320 320 ucovm1(ijb:ije,l)=uscr(ijb:ije) 321 321 tetam1(ijb:ije,l)=hscr(ijb:ije) 322 if(pole_sud) ije=ij_end-iip1322 IF (pole_sud) ije=ij_end-iip1 323 323 vcovm1(ijb:ije,l)=vscr(ijb:ije) 324 324 … … 334 334 ije=ij_end 335 335 336 if(planet_type=="earth") THEN336 IF (planet_type=="earth") THEN 337 337 ! Earth-specific treatment of first 2 tracers (water) 338 338 !$OMP BARRIER … … 415 415 !c$OMP END DO NOWAIT 416 416 417 endif ! of if (planet_type.eq."earth")417 ENDIF ! of if (planet_type.EQ."earth") 418 418 419 419 ! -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_gam_loc.f90
r5106 r5117 45 45 ijb=ij_begin-iip1 46 46 ije=ij_end+iip1 47 if(pole_nord) ijb=ij_begin48 if(pole_sud ) ije=ij_end47 IF (pole_nord) ijb=ij_begin 48 IF (pole_sud ) ije=ij_end 49 49 50 50 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_loc.f90
r5106 r5117 36 36 ijb=ij_begin-iip1 37 37 ije=ij_end+iip1 38 if(pole_nord) ijb=ij_begin39 if(pole_sud ) ije=ij_end38 IF (pole_nord) ijb=ij_begin 39 IF (pole_sud ) ije=ij_end 40 40 41 41 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 47 47 jjb=jj_begin-1 48 48 jje=jj_end+1 49 if(pole_nord) jjb=jj_begin50 if(pole_sud ) jje=jj_end49 IF (pole_nord) jjb=jj_begin 50 IF (pole_sud ) jje=jj_end 51 51 52 52 CALL filtreg_p( divgra,jjb_u,jje_u,jjb,jje,jjp1, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_rot_loc.f90
r5106 r5117 35 35 jje=jj_end+1 36 36 37 if(pole_nord) jjb=jj_begin38 if(pole_sud) jje=jj_end-137 IF (pole_nord) jjb=jj_begin 38 IF (pole_sud) jje=jj_end-1 39 39 40 40 CALL filtreg_p ( rotin ,jjb_v,jje_v,jjb,jje,jjm, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/leapfrog_loc.F90
r5116 r5117 9 9 USE mod_hallo 10 10 USE Bands 11 USE strings_mod, ONLY: int2str11 USE lmdz_strings, ONLY: int2str 12 12 USE Write_Field_p 13 USE vampir13 USE lmdz_vampir 14 14 USE lmdz_timer_filtre, ONLY: print_filtre_timer 15 15 USE infotrac … … 27 27 , leapfrog_allocate, leapfrog_switch_caldyn, leapfrog_switch_dissip 28 28 29 useexner_hyb_loc_m, ONLY: exner_hyb_loc30 useexner_milieu_loc_m, ONLY: exner_milieu_loc29 USE exner_hyb_loc_m, ONLY: exner_hyb_loc 30 USE exner_milieu_loc_m, ONLY: exner_milieu_loc 31 31 USE comconst_mod, ONLY: cpp, dtvr, ihf 32 32 USE comvert_mod, ONLY: ap, bp, pressure_exner … … 150 150 REAL :: secondes 151 151 152 logical:: physic152 LOGICAL :: physic 153 153 LOGICAL :: first, callinigrads 154 154 … … 213 213 lafin = .FALSE. 214 214 215 if(nday>=0) THEN215 IF (nday>=0) THEN 216 216 itaufin = nday * day_step 217 217 else 218 218 itaufin = -nday 219 endif219 ENDIF 220 220 221 221 itaufinp1 = itaufin + 1 … … 225 225 itau = 0 226 226 physic = .TRUE. 227 if (iflag_phys==0.or.iflag_phys==2) physic = .FALSE.227 IF (iflag_phys==0.OR.iflag_phys==2) physic = .FALSE. 228 228 CALL init_nan 229 229 CALL leapfrog_allocate … … 247 247 ! Allocate variables depending on dynamic variable nqtot 248 248 !$OMP MASTER 249 if(firstcall) THEN249 IF (firstcall) THEN 250 250 ! ALLOCATE(p(ijb_u:ije_u,llmp1)) 251 251 ! ALLOCATE(pks(ijb_u:ije_u)) … … 274 274 ! ALLOCATE(vcont(ijb_v:ije_v,llm),ucont(ijb_u:ije_u,llm)) 275 275 ! ALLOCATE(vnat(ijb_v:ije_v,llm),unat(ijb_u:ije_u,llm)) 276 endif276 ENDIF 277 277 !$OMP END MASTER 278 278 !$OMP BARRIER … … 290 290 CALL pression (ijnb_u, ap, bp, ps, p) 291 291 !$OMP END MASTER 292 if(pressure_exner) THEN292 IF (pressure_exner) THEN 293 293 CALL exner_hyb_loc(ijnb_u, ps, p, pks, pk, pkf) 294 294 else 295 295 CALL exner_milieu_loc(ijnb_u, ps, p, pks, pk, pkf) 296 endif296 ENDIF 297 297 !----------------------------------------------------------------------- 298 298 ! Debut de l'integration temporelle: … … 309 309 jH_cur = jH_ref + start_time + & 310 310 mod(itau + 1, day_step) / float(day_step) 311 if(jH_cur > 1.0) THEN311 IF (jH_cur > 1.0) THEN 312 312 jD_cur = jD_cur + 1. 313 313 jH_cur = jH_cur - 1. 314 endif314 ENDIF 315 315 316 316 CALL check_isotopes(q, ijb_u, ije_u, 'leapfrog 321') 317 317 318 if(ok_guide) THEN318 IF (ok_guide) THEN 319 319 CALL guide_main(itau,ucov,vcov,teta,q,masse,ps) 320 320 !$OMP BARRIER 321 endif321 ENDIF 322 322 323 323 … … 334 334 !ym CALL SCOPY( ip1jmp1, ps , 1, psm1 , 1 ) 335 335 336 if(FirstCaldyn) THEN336 IF (FirstCaldyn) THEN 337 337 !$OMP MASTER 338 338 ucovm1 = ucov … … 365 365 ! finvmaold(ijb:ije,l)=masse(ijb:ije,l) 366 366 367 if(pole_sud) ije = ij_end - iip1367 IF (pole_sud) ije = ij_end - iip1 368 368 vcovm1(ijb:ije, l) = vcov (ijb:ije, l) 369 369 … … 376 376 ! . llm, -2,2, .TRUE., 1 ) 377 377 378 endif! of if (FirstCaldyn)378 ENDIF ! of if (FirstCaldyn) 379 379 380 380 forward = .TRUE. … … 398 398 !$OMP MASTER 399 399 ItCount = ItCount + 1 400 if(MOD(ItCount, 1)==1) THEN400 IF (MOD(ItCount, 1)==1) THEN 401 401 debug = .TRUE. 402 402 else 403 403 debug = .FALSE. 404 endif404 ENDIF 405 405 !$OMP END MASTER 406 406 !----------------------------------------------------------------------- … … 414 414 jH_cur = jH_ref + start_time + & 415 415 mod(itau + 1, day_step) / float(day_step) 416 if(jH_cur > 1.0) THEN416 IF (jH_cur > 1.0) THEN 417 417 jD_cur = jD_cur + 1. 418 418 jH_cur = jH_cur - 1. … … 436 436 apdiss = .TRUE. 437 437 IF(MOD(itau, iphysiq)==0.AND..NOT.forward & 438 . and. physic) apphys = .TRUE.438 .AND. physic) apphys = .TRUE. 439 439 ELSE 440 440 ! Leapfrog/Matsuno time stepping … … 447 447 ! Ehouarn: for Shallow Water case (ie: 1 vertical layer), 448 448 ! supress dissipation step 449 if(llm==1) THEN449 IF (llm==1) THEN 450 450 apdiss = .FALSE. 451 endif451 ENDIF 452 452 453 453 !ym ---> Pour le moment … … 456 456 ! conser = .FALSE. ! ie: no output of control variables to stdout in // 457 457 458 if(firstCaldyn) THEN458 IF (firstCaldyn) THEN 459 459 !$OMP MASTER 460 460 CALL Set_Distrib(distrib_caldyn) … … 466 466 CALL Init_timer 467 467 !$OMP END MASTER 468 endif468 ENDIF 469 469 470 470 !$OMP MASTER … … 478 478 479 479 !ym PAS D'AJUSTEMENT POUR LE MOMENT 480 if(Adjust) THEN480 IF (Adjust) THEN 481 481 AdjustCount = AdjustCount + 1 482 ! if (iapptrac==iapp_tracvl . and. (forward .OR. leapf)483 ! & . and. itau/iphysiq>2 .and. Adjustcount>30) THEN484 if(Adjustcount>1) THEN482 ! if (iapptrac==iapp_tracvl .AND. (forward .OR. leapf) 483 ! & .AND. itau/iphysiq>2 .AND. Adjustcount>30) THEN 484 IF (Adjustcount>1) THEN 485 485 AdjustCount = 0 486 486 !$OMP MASTER 487 487 CALL allgather_timer_average 488 488 489 if(prt_level > 9) THEN489 IF (prt_level > 9) THEN 490 490 print *, '*********************************' 491 491 print *, '****** TIMER CALDYN ******' … … 586 586 587 587 !$OMP MASTER 588 if(mpi_rank==0) CALL WriteBands588 IF (mpi_rank==0) CALL WriteBands 589 589 !$OMP END MASTER 590 590 591 591 endif 592 endif592 ENDIF 593 593 594 594 CALL check_isotopes(q, ijb_u, ije_u, 'leapfrog 589') … … 625 625 !$OMP BARRIER 626 626 627 if(debug) THEN627 IF (debug) THEN 628 628 CALL WriteField_u('ucov', ucov) 629 629 CALL WriteField_v('vcov', vcov) … … 639 639 q(:, :, iq)) 640 640 enddo 641 endif641 ENDIF 642 642 643 643 True_itau = True_itau + 1 … … 670 670 671 671 !$OMP MASTER 672 if(mpi_rank==0.AND.conser) THEN672 IF (mpi_rank==0.AND.conser) THEN 673 673 WRITE(lunout, *) 'leapfrog_loc, Time step: ', itau, ' Day:', time 674 674 ENDIF … … 728 728 !$OMP END MASTER 729 729 IF (CPPKEY_DEBUGIO) THEN 730 if(true_itau>20) THEN730 IF (true_itau>20) THEN 731 731 CALL WriteField_u('ucovm1', ucovm1) 732 732 CALL WriteField_v('vcovm1', vcovm1) … … 802 802 ! c-jld 803 803 !$OMP MASTER 804 if(FirstPhysic) THEN804 IF (FirstPhysic) THEN 805 805 ok_start_timer = .TRUE. 806 806 FirstPhysic = .FALSE. … … 814 814 IF(iflag_phys==2) THEN ! "Newtonian" case 815 815 !$OMP MASTER 816 if(FirstPhysic) THEN816 IF (FirstPhysic) THEN 817 817 ok_start_timer = .TRUE. 818 818 FirstPhysic = .FALSE. … … 838 838 839 839 !$OMP MASTER 840 if(planet_type=="giant") THEN840 IF (planet_type=="giant") THEN 841 841 ! add an intrinsic heat flux at the base of the atmosphere 842 842 teta(ijb:ije, 1) = teta(ijb:ije, 1) & … … 864 864 CALL pression_loc (ip1jmp1, ap, bp, ps, p) 865 865 !$OMP BARRIER 866 if(pressure_exner) THEN866 IF (pressure_exner) THEN 867 867 CALL exner_hyb_loc(ijnb_u, ps, p, pks, pk, pkf) 868 868 else 869 869 CALL exner_milieu_loc(ijnb_u, ps, p, pks, pk, pkf) 870 endif870 ENDIF 871 871 !$OMP BARRIER 872 872 CALL massdair_loc(p, masse) … … 897 897 CALL allgather_timer_average 898 898 CALL barrier 899 if(mpi_rank==0) THEN899 IF (mpi_rank==0) THEN 900 900 print *, '*********************************' 901 901 print *, '****** TIMER CALDYN ******' … … 944 944 !$OMP END MASTER 945 945 946 if(ok_guide) THEN946 IF (ok_guide) THEN 947 947 ! set ok_guide to false to avoid extra output 948 948 ! in following forward step … … 960 960 ENDIF 961 961 #ifdef REPROBUS 962 if(type_trac == 'repr') CALL finalize_reprobus962 IF (type_trac == 'repr') CALL finalize_reprobus 963 963 #endif 964 964 … … 988 988 989 989 IF(itau == itaufinp1) THEN 990 if(flag_verif) THEN990 IF (flag_verif) THEN 991 991 WRITE(79, *) 'ucov', ucov 992 992 WRITE(80, *) 'vcov', vcov … … 1013 1013 ENDIF 1014 1014 #ifdef REPROBUS 1015 if(type_trac == 'repr') CALL finalize_reprobus1015 IF (type_trac == 'repr') CALL finalize_reprobus 1016 1016 #endif 1017 1017 … … 1064 1064 IF(MOD(itau, iecri)==0) THEN 1065 1065 ! Ehouarn: output only during LF or Backward Matsuno 1066 if (leapf.or.(.not.leapf.and.(.not.forward))) THEN1066 IF (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) THEN 1067 1067 !$OMP BARRIER 1068 1068 !$OMP MASTER … … 1071 1071 !$OMP BARRIER 1072 1072 1073 if(ok_dyn_ins) THEN1073 IF (ok_dyn_ins) THEN 1074 1074 CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, & 1075 1075 masse,ps,phis) … … 1085 1085 ENDIF 1086 1086 1087 endif ! of if (leapf. or.(.not.leapf.and.(.not.forward)))1087 endif ! of if (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) 1088 1088 1089 1089 ENDIF ! of IF(MOD(itau,iecri).EQ.0) … … 1093 1093 !$OMP BARRIER 1094 1094 1095 ! if (planet_type. eq."earth") THEN1095 ! if (planet_type.EQ."earth") THEN 1096 1096 ! Write an Earth-format restart file 1097 1097 CALL dynredem1_loc("restart.nc", 0.0, & 1098 1098 vcov, ucov, teta, q, masse, ps) 1099 ! endif ! of if (planet_type.eq."earth")1100 if(ok_guide) THEN1099 ! END IF ! of if (planet_type.EQ."earth") 1100 IF (ok_guide) THEN 1101 1101 ! set ok_guide to false to avoid extra output 1102 1102 ! in following forward step … … 1141 1141 ! ELSEIF (MOD(itau-1,iperiod).EQ.0) 1142 1142 1143 ELSE ! of IF (. not.purmats)1143 ELSE ! of IF (.NOT.purmats) 1144 1144 1145 1145 CALL check_isotopes(q, ijb_u, ije_u, 'leapfrog 1664') … … 1175 1175 ENDIF 1176 1176 #ifdef REPROBUS 1177 if(type_trac == 'repr') CALL finalize_reprobus1177 IF (type_trac == 'repr') CALL finalize_reprobus 1178 1178 #endif 1179 1179 … … 1226 1226 1227 1227 1228 if(ok_dyn_ins) THEN1228 IF (ok_dyn_ins) THEN 1229 1229 CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, & 1230 1230 masse,ps,phis) … … 1243 1243 1244 1244 IF(itau==itaufin) THEN 1245 ! if (planet_type. eq."earth") THEN1245 ! if (planet_type.EQ."earth") THEN 1246 1246 CALL dynredem1_loc("restart.nc", 0.0, & 1247 1247 vcov, ucov, teta, q, masse, ps) 1248 ! endif ! of if (planet_type.eq."earth")1249 if(ok_guide) THEN1248 ! END IF ! of if (planet_type.EQ."earth") 1249 IF (ok_guide) THEN 1250 1250 ! set ok_guide to false to avoid extra output 1251 1251 ! in following forward step … … 1262 1262 CALL check_isotopes(q, ijb_u, ije_u, 'leapfrog 1750') 1263 1263 1264 END IF ! of IF(. not.purmats)1264 END IF ! of IF(.NOT.purmats) 1265 1265 !$OMP MASTER 1266 1266 CALL fin_getparam … … 1277 1277 ENDIF 1278 1278 #ifdef REPROBUS 1279 if(type_trac == 'repr') CALL finalize_reprobus1279 IF (type_trac == 'repr') CALL finalize_reprobus 1280 1280 #endif 1281 1281 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_call_calfis.F90
r5116 r5117 71 71 phis_dyn, q_dyn, flxw_dyn) 72 72 USE dimensions_mod 73 useexner_hyb_loc_m, ONLY: exner_hyb_loc74 useexner_milieu_loc_m, ONLY: exner_milieu_loc73 USE exner_hyb_loc_m, ONLY: exner_hyb_loc 74 USE exner_milieu_loc_m, ONLY: exner_milieu_loc 75 75 USE parallel_lmdz 76 76 USE times 77 77 USE mod_hallo 78 78 USE Bands 79 USE vampir79 USE lmdz_vampir 80 80 USE infotrac, ONLY: nqtot 81 81 USE control_mod 82 82 USE write_field_loc 83 USE strings_mod, ONLY: int2str83 USE lmdz_strings, ONLY: int2str 84 84 USE comconst_mod, ONLY: dtphys 85 85 USE logic_mod, ONLY: leapf, forward, ok_strato … … 144 144 jH_cur = jH_ref + start_time + & 145 145 mod(itau + 1, day_step) / float(day_step) 146 if(jH_cur > 1.0) THEN146 IF (jH_cur > 1.0) THEN 147 147 jD_cur = jD_cur + 1. 148 148 jH_cur = jH_cur - 1. … … 231 231 ijb = ij_begin 232 232 ije = ij_end 233 IF (. not. pole_nord) THEN233 IF (.NOT. pole_nord) THEN 234 234 235 235 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 246 246 !$OMP END MASTER 247 247 248 ENDIF ! of if ( . not. pole_nord)248 ENDIF ! of if ( .NOT. pole_nord) 249 249 250 250 !$OMP BARRIER … … 275 275 !$OMP BARRIER 276 276 ijb = ij_begin 277 IF (. not. pole_nord) THEN277 IF (.NOT. pole_nord) THEN 278 278 279 279 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 290 290 !$OMP END MASTER 291 291 292 endif ! of if (. not. pole_nord)292 endif ! of if (.NOT. pole_nord) 293 293 294 294 IF (CPPKEY_DEBUGIO) THEN … … 334 334 CALL massdair_loc(p, masse) 335 335 !$OMP BARRIER 336 if(pressure_exner) THEN336 IF (pressure_exner) THEN 337 337 CALL exner_hyb_loc(ijnb_u, ps, p, pks, pk, pkf) 338 338 else -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_filtreg_p.F90
r5113 r5117 102 102 !-------------------------------------------------------c 103 103 104 IF(ifiltre==1. or.ifiltre==-1) &104 IF(ifiltre==1.OR.ifiltre==-1) & 105 105 CALL abort_gcm("lmdz_filtreg_p", 'Pas de transformee& 106 106 &simple dans cette version', 1) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/massdair_loc.f90
r5105 r5117 88 88 ije=ij_end+2*iip1 89 89 90 if(pole_nord) ijb=ij_begin91 if(pole_sud) ije=ij_end90 IF (pole_nord) ijb=ij_begin 91 IF (pole_sud) ije=ij_end 92 92 93 93 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_const_mpi.F90
r5116 r5117 18 18 USE mod_prism 19 19 #endif 20 USE wxios, ONLY: wxios_init, using_xios20 USE lmdz_wxios, ONLY: wxios_init, using_xios 21 21 IMPLICIT NONE 22 22 … … 56 56 SUBROUTINE Init_mpi 57 57 USE lmdz_mpi 58 USE wxios, ONLY: wxios_init, using_xios58 USE lmdz_wxios, ONLY: wxios_init, using_xios 59 59 60 60 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_hallo.F90
r5116 r5117 3 3 IMPLICIT NONE 4 4 logical,save :: use_mpi_alloc 5 integer, parameter :: MaxProc=5126 integer, parameter :: DefaultMaxBufferSize=1024*1024*1007 integer, SAVE :: MaxBufferSize=08 integer, parameter :: ListSize=10009 10 integer,save :: MaxBufferSize_Used5 INTEGER, parameter :: MaxProc=512 6 INTEGER, parameter :: DefaultMaxBufferSize=1024*1024*100 7 INTEGER, SAVE :: MaxBufferSize=0 8 INTEGER, parameter :: ListSize=1000 9 10 INTEGER,save :: MaxBufferSize_Used 11 11 !$OMP THREADPRIVATE( MaxBufferSize_Used) 12 12 13 real,save,pointer,dimension(:) :: Buffer13 REAL,SAVE,pointer,DIMENSION(:) :: Buffer 14 14 !$OMP THREADPRIVATE(Buffer) 15 15 16 integer,save,dimension(Listsize) :: Buffer_Pos17 integer,save :: Index_Pos16 INTEGER,SAVE,DIMENSION(Listsize) :: Buffer_Pos 17 INTEGER,save :: Index_Pos 18 18 !$OMP THREADPRIVATE(Buffer_Pos,Index_pos) 19 19 20 20 type Hallo 21 real, dimension(:,:),pointer :: Field21 REAL, DIMENSION(:,:),pointer :: Field 22 22 INTEGER :: offset 23 23 INTEGER :: size … … 37 37 38 38 type request 39 type(request_SR), dimension(0:MaxProc-1) :: RequestSend40 type(request_SR), dimension(0:MaxProc-1) :: RequestRecv39 type(request_SR),DIMENSION(0:MaxProc-1) :: RequestSend 40 type(request_SR),DIMENSION(0:MaxProc-1) :: RequestRecv 41 41 INTEGER :: tag=1 42 42 end type request … … 143 143 INTEGER :: Pos 144 144 145 if (Buffer_pos(Index_pos)+Size>MaxBufferSize_Used) MaxBufferSize_Used=Buffer_pos(Index_pos)+Size146 if(Buffer_pos(Index_pos)+Size>MaxBufferSize) THEN145 IF (Buffer_pos(Index_pos)+Size>MaxBufferSize_Used) MaxBufferSize_Used=Buffer_pos(Index_pos)+Size 146 IF (Buffer_pos(Index_pos)+Size>MaxBufferSize) THEN 147 147 print *,'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!' 148 148 CALL abort_gcm("mod_hallo","stopped",1) 149 149 endif 150 150 151 if(Index_pos>=ListSize) THEN151 IF (Index_pos>=ListSize) THEN 152 152 print *,'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!' 153 153 CALL abort_gcm("mod_hallo","stopped",1) … … 167 167 Buffer_Pos(Index)=-1 168 168 169 do while (Buffer_Pos(Index_Pos)==-1 . and. Index_Pos>1)169 do while (Buffer_Pos(Index_Pos)==-1 .AND. Index_Pos>1) 170 170 Index_Pos=Index_Pos-1 171 171 END DO … … 187 187 INTEGER :: size 188 188 INTEGER :: offset 189 real, dimension(Stride,NbLevel),target :: Field189 REAL, DIMENSION(Stride,NbLevel),target :: Field 190 190 type(request_SR),pointer :: Ptr_request 191 191 type(Hallo),POINTER :: NewHallos(:),HalloSwitch(:), NewHallo … … 220 220 221 221 INTEGER :: ij,ll,offset,size,target 222 REAL, dimension(ij,ll) :: Field222 REAL, DIMENSION(ij,ll) :: Field 223 223 type(request),target :: a_request 224 224 type(request_SR),pointer :: Ptr_request … … 236 236 237 237 INTEGER :: ij,ll,offset,size,target 238 REAL, dimension(ij,ll) :: Field238 REAL, DIMENSION(ij,ll) :: Field 239 239 type(request),target :: a_request 240 240 type(request_SR),pointer :: Ptr_request … … 253 253 254 254 INTEGER :: ij,ll 255 REAL, dimension(ij,ll) :: FieldS256 REAL, dimension(ij,ll) :: FieldR255 REAL, DIMENSION(ij,ll) :: FieldS 256 REAL, DIMENSION(ij,ll) :: FieldR 257 257 type(request) :: a_request 258 integer,dimension(0:MPI_Size-1) :: jj_Nb_New259 integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New258 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 259 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 260 260 261 261 INTEGER ::i,jje,jjb … … 269 269 270 270 do i=0,MPI_Size-1 271 if(i /= MPI_Rank) THEN271 IF (i /= MPI_Rank) THEN 272 272 jjb=max(jj_begin_new(i),jj_begin) 273 273 jje=min(jj_end_new(i),jj_end) 274 274 275 if (ij==ip1jm .and. jje==jjp1) jje=jjm276 277 if(jje >= jjb) THEN275 IF (ij==ip1jm .AND. jje==jjp1) jje=jjm 276 277 IF (jje >= jjb) THEN 278 278 CALL Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 279 279 endif … … 282 282 jje=min(jj_end_new(MPI_Rank),jj_end_Para(i)) 283 283 284 if (ij==ip1jm .and. jje==jjp1) jje=jjm285 286 if(jje >= jjb) THEN284 IF (ij==ip1jm .AND. jje==jjp1) jje=jjm 285 286 IF (jje >= jjb) THEN 287 287 CALL Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 288 288 endif … … 301 301 302 302 INTEGER :: ij,ll,Up,Down 303 REAL, dimension(ij,ll) :: FieldS304 REAL, dimension(ij,ll) :: FieldR303 REAL, DIMENSION(ij,ll) :: FieldS 304 REAL, DIMENSION(ij,ll) :: FieldR 305 305 type(request) :: a_request 306 integer,dimension(0:MPI_Size-1) :: jj_Nb_New307 integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New306 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 307 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 308 308 309 309 INTEGER ::i,jje,jjb … … 322 322 323 323 do i=0,MPI_Size-1 324 if(i /= MPI_Rank) THEN324 IF (i /= MPI_Rank) THEN 325 325 jjb=max(jj_begin_new(i),jj_begin) 326 326 jje=min(jj_end_new(i),jj_end) 327 327 328 if (ij==ip1jm .and. jje==jjp1) jje=jjm329 330 if(jje >= jjb) THEN328 IF (ij==ip1jm .AND. jje==jjp1) jje=jjm 329 330 IF (jje >= jjb) THEN 331 331 CALL Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 332 332 endif … … 335 335 jje=min(jj_end_new(MPI_Rank),jj_end_Para(i)) 336 336 337 if (ij==ip1jm .and. jje==jjp1) jje=jjm338 339 if(jje >= jjb) THEN337 IF (ij==ip1jm .AND. jje==jjp1) jje=jjm 338 339 IF (jje >= jjb) THEN 340 340 CALL Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 341 341 endif … … 1153 1153 1154 1154 INTEGER :: ij,ll 1155 REAL, dimension(ij,ll) :: Field1155 REAL, DIMENSION(ij,ll) :: Field 1156 1156 INTEGER :: Sup,Sdown,rup,rdown 1157 1157 type(request) :: a_request … … 1176 1176 ENDIF 1177 1177 1178 if(Sup==0) THEN1178 IF (Sup==0) THEN 1179 1179 SendUp=.FALSE. 1180 1180 endif 1181 1181 1182 if(Sdown==0) THEN1182 IF (Sdown==0) THEN 1183 1183 SendDown=.FALSE. 1184 1184 endif 1185 1185 1186 if(Rup==0) THEN1186 IF (Rup==0) THEN 1187 1187 RecvUp=.FALSE. 1188 1188 endif 1189 1189 1190 if(Rdown==0) THEN1190 IF (Rdown==0) THEN 1191 1191 RecvDown=.FALSE. 1192 1192 endif … … 1217 1217 IMPLICIT NONE 1218 1218 INTEGER :: ll 1219 REAL, dimension(ijb_u:ije_u,ll) :: Field1219 REAL, DIMENSION(ijb_u:ije_u,ll) :: Field 1220 1220 INTEGER :: Sup,Sdown,rup,rdown 1221 1221 type(request) :: a_request … … 1240 1240 ENDIF 1241 1241 1242 if(Sup==0) THEN1242 IF (Sup==0) THEN 1243 1243 SendUp=.FALSE. 1244 1244 endif 1245 1245 1246 if(Sdown==0) THEN1246 IF (Sdown==0) THEN 1247 1247 SendDown=.FALSE. 1248 1248 endif 1249 1249 1250 if(Rup==0) THEN1250 IF (Rup==0) THEN 1251 1251 RecvUp=.FALSE. 1252 1252 endif 1253 1253 1254 if(Rdown==0) THEN1254 IF (Rdown==0) THEN 1255 1255 RecvDown=.FALSE. 1256 1256 endif … … 1280 1280 IMPLICIT NONE 1281 1281 INTEGER :: ll 1282 REAL, dimension(ijb_v:ije_v,ll) :: Field1282 REAL, DIMENSION(ijb_v:ije_v,ll) :: Field 1283 1283 INTEGER :: Sup,Sdown,rup,rdown 1284 1284 type(request) :: a_request … … 1303 1303 ENDIF 1304 1304 1305 if(Sup==0) THEN1305 IF (Sup==0) THEN 1306 1306 SendUp=.FALSE. 1307 1307 endif 1308 1308 1309 if(Sdown==0) THEN1309 IF (Sdown==0) THEN 1310 1310 SendDown=.FALSE. 1311 1311 endif 1312 1312 1313 if(Rup==0) THEN1313 IF (Rup==0) THEN 1314 1314 RecvUp=.FALSE. 1315 1315 endif 1316 1316 1317 if(Rdown==0) THEN1317 IF (Rdown==0) THEN 1318 1318 RecvDown=.FALSE. 1319 1319 endif … … 1349 1349 INTEGER :: i,rank,l,ij,Pos,ierr 1350 1350 INTEGER :: offset 1351 real,dimension(:,:),pointer :: Field1351 REAL,DIMENSION(:,:),pointer :: Field 1352 1352 INTEGER :: Nb 1353 1353 … … 1367 1367 1368 1368 Req%BufferSize=SizeBuffer 1369 if(Req%NbRequest>0) THEN1369 IF (Req%NbRequest>0) THEN 1370 1370 CALL allocate_buffer(SizeBuffer,Req%Index,Req%pos) 1371 1371 … … 1389 1389 enddo 1390 1390 1391 if(SizeBuffer>0) THEN1391 IF (SizeBuffer>0) THEN 1392 1392 !$OMP CRITICAL (MPI) 1393 1393 … … 1426 1426 Req%BufferSize=SizeBuffer 1427 1427 1428 if(Req%NbRequest>0) THEN1428 IF (Req%NbRequest>0) THEN 1429 1429 CALL allocate_buffer(SizeBuffer,Req%Index,Req%Pos) 1430 1430 1431 if(SizeBuffer>0) THEN1431 IF (SizeBuffer>0) THEN 1432 1432 !$OMP CRITICAL (MPI) 1433 1433 … … 1462 1462 type(request_SR),pointer :: Req 1463 1463 type(Hallo),pointer :: PtrHallo 1464 integer, dimension(2*mpi_size) :: TabRequest1465 integer, dimension(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus1464 INTEGER, DIMENSION(2*mpi_size) :: TabRequest 1465 INTEGER, DIMENSION(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus 1466 1466 INTEGER :: NbRequest 1467 1467 INTEGER :: i,rank,pos,ij,l,ierr … … 1473 1473 do rank=0,MPI_SIZE-1 1474 1474 Req=>a_request%RequestSend(rank) 1475 if(Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN1475 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN 1476 1476 NbRequest=NbRequest+1 1477 1477 TabRequest(NbRequest)=Req%MSG_Request … … 1481 1481 do rank=0,MPI_SIZE-1 1482 1482 Req=>a_request%RequestRecv(rank) 1483 if(Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN1483 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1484 1484 NbRequest=NbRequest+1 1485 1485 TabRequest(NbRequest)=Req%MSG_Request … … 1487 1487 enddo 1488 1488 1489 if(NbRequest>0) THEN1489 IF (NbRequest>0) THEN 1490 1490 !$OMP CRITICAL (MPI) 1491 1491 ! PRINT *,"-------------------------------------------------------------------" … … 1499 1499 do rank=0,MPI_Size-1 1500 1500 Req=>a_request%RequestRecv(rank) 1501 if(Req%NbRequest>0) THEN1501 IF (Req%NbRequest>0) THEN 1502 1502 Pos=Req%Pos 1503 1503 do i=1,Req%NbRequest … … 1522 1522 do rank=0,MPI_SIZE-1 1523 1523 Req=>a_request%RequestSend(rank) 1524 if(Req%NbRequest>0) THEN1524 IF (Req%NbRequest>0) THEN 1525 1525 CALL deallocate_buffer(Req%Index) 1526 1526 Req%NbRequest=0 … … 1530 1530 do rank=0,MPI_SIZE-1 1531 1531 Req=>a_request%RequestRecv(rank) 1532 if(Req%NbRequest>0) THEN1532 IF (Req%NbRequest>0) THEN 1533 1533 CALL deallocate_buffer(Req%Index) 1534 1534 Req%NbRequest=0 … … 1547 1547 type(request_SR),pointer :: Req 1548 1548 type(Hallo),pointer :: PtrHallo 1549 integer, dimension(mpi_size) :: TabRequest1550 integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus1549 INTEGER, DIMENSION(mpi_size) :: TabRequest 1550 INTEGER, DIMENSION(MPI_STATUS_SIZE,mpi_size) :: TabStatus 1551 1551 INTEGER :: NbRequest 1552 1552 INTEGER :: i,rank,pos,ij,l,ierr … … 1557 1557 do rank=0,MPI_SIZE-1 1558 1558 Req=>a_request%RequestSend(rank) 1559 if(Req%NbRequest>0) THEN1559 IF (Req%NbRequest>0) THEN 1560 1560 NbRequest=NbRequest+1 1561 1561 TabRequest(NbRequest)=Req%MSG_Request … … 1564 1564 1565 1565 1566 if (NbRequest>0 .AND. Req%BufferSize > 0 ) THEN1566 IF (NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1567 1567 !$OMP CRITICAL (MPI) 1568 1568 ! PRINT *,"-------------------------------------------------------------------" … … 1578 1578 do rank=0,MPI_SIZE-1 1579 1579 Req=>a_request%RequestSend(rank) 1580 if(Req%NbRequest>0) THEN1580 IF (Req%NbRequest>0) THEN 1581 1581 CALL deallocate_buffer(Req%Index) 1582 1582 Req%NbRequest=0 … … 1594 1594 type(request_SR),pointer :: Req 1595 1595 type(Hallo),pointer :: PtrHallo 1596 integer, dimension(mpi_size) :: TabRequest1597 integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus1596 INTEGER, DIMENSION(mpi_size) :: TabRequest 1597 INTEGER, DIMENSION(MPI_STATUS_SIZE,mpi_size) :: TabStatus 1598 1598 INTEGER :: NbRequest 1599 1599 INTEGER :: i,rank,pos,ij,l,ierr … … 1605 1605 do rank=0,MPI_SIZE-1 1606 1606 Req=>a_request%RequestRecv(rank) 1607 if(Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN1607 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1608 1608 NbRequest=NbRequest+1 1609 1609 TabRequest(NbRequest)=Req%MSG_Request … … 1612 1612 1613 1613 1614 if(NbRequest>0) THEN1614 IF (NbRequest>0) THEN 1615 1615 !$OMP CRITICAL (MPI) 1616 1616 ! PRINT *,"-------------------------------------------------------------------" … … 1625 1625 do rank=0,MPI_Size-1 1626 1626 Req=>a_request%RequestRecv(rank) 1627 if(Req%NbRequest>0) THEN1627 IF (Req%NbRequest>0) THEN 1628 1628 Pos=Req%Pos 1629 1629 do i=1,Req%NbRequest … … 1647 1647 do rank=0,MPI_SIZE-1 1648 1648 Req=>a_request%RequestRecv(rank) 1649 if(Req%NbRequest>0) THEN1649 IF (Req%NbRequest>0) THEN 1650 1650 CALL deallocate_buffer(Req%Index) 1651 1651 Req%NbRequest=0 … … 1664 1664 1665 1665 INTEGER :: ij,ll,l 1666 REAL, dimension(ij,ll) :: FieldS1667 REAL, dimension(ij,ll) :: FieldR1668 integer,dimension(0:MPI_Size-1) :: jj_Nb_New1669 integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New1666 REAL, DIMENSION(ij,ll) :: FieldS 1667 REAL, DIMENSION(ij,ll) :: FieldR 1668 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 1669 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 1670 1670 1671 1671 INTEGER ::i,jje,jjb,ijb,ije … … 1680 1680 jjb=max(jj_begin,jj_begin_new(MPI_Rank)) 1681 1681 jje=min(jj_end,jj_end_new(MPI_Rank)) 1682 if(ij==ip1jm) jje=min(jje,jjm)1683 1684 if(jje >= jjb) THEN1682 IF (ij==ip1jm) jje=min(jje,jjm) 1683 1684 IF (jje >= jjb) THEN 1685 1685 ijb=(jjb-1)*iip1+1 1686 1686 ije=jje*iip1 … … 1702 1702 1703 1703 INTEGER :: ij,ll,Up,Down 1704 REAL, dimension(ij,ll) :: FieldS1705 REAL, dimension(ij,ll) :: FieldR1706 integer,dimension(0:MPI_Size-1) :: jj_Nb_New1707 integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New1704 REAL, DIMENSION(ij,ll) :: FieldS 1705 REAL, DIMENSION(ij,ll) :: FieldR 1706 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 1707 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 1708 1708 1709 1709 INTEGER ::i,jje,jjb,ijb,ije,l … … 1720 1720 jjb=max(jj_begin,jj_begin_new(MPI_Rank)-Up) 1721 1721 jje=min(jj_end,jj_end_new(MPI_Rank)+Down) 1722 if(ij==ip1jm) jje=min(jje,jjm)1723 1724 1725 if(jje >= jjb) THEN1722 IF (ij==ip1jm) jje=min(jje,jjm) 1723 1724 1725 IF (jje >= jjb) THEN 1726 1726 ijb=(jjb-1)*iip1+1 1727 1727 ije=jje*iip1 … … 1743 1743 REAL :: field_glo(ip1jmp1,ll) 1744 1744 type(request) :: request_gather 1745 integer:: l1745 INTEGER :: l 1746 1746 1747 1747 … … 1767 1767 type(request) :: request_gather 1768 1768 INTEGER :: ijb,ije 1769 integer:: l1769 INTEGER :: l 1770 1770 1771 1771 1772 1772 ijb=ij_begin 1773 1773 ije=ij_end 1774 if(pole_sud) ije=ij_end-iip11774 IF (pole_sud) ije=ij_end-iip1 1775 1775 1776 1776 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 1795 1795 type(request) :: request_gather 1796 1796 TYPE(distrib) :: distrib_swap 1797 integer:: l1797 INTEGER :: l 1798 1798 1799 1799 !$OMP BARRIER … … 1829 1829 type(request) :: request_gather 1830 1830 TYPE(distrib) :: distrib_swap 1831 integer:: ijb,ije,l1831 INTEGER :: ijb,ije,l 1832 1832 1833 1833 … … 1849 1849 ijb=ij_begin 1850 1850 ije=ij_end 1851 if(pole_sud) ije=ij_end-iip11851 IF (pole_sud) ije=ij_end-iip1 1852 1852 1853 1853 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_xios_dyn3dmem.F90
r5103 r5117 15 15 16 16 USE lmdz_xios 17 USE wxios, ONLY: g_comm17 USE lmdz_wxios, ONLY: g_comm 18 18 CHARACTER(len=100), SAVE :: dyn3d_ctx_name = "LMDZDYN" 19 19 TYPE(xios_context), SAVE :: dyn3d_ctx_handle -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgrad_gam_loc.f90
r5116 r5117 52 52 END DO 53 53 54 if(pole_nord) THEN54 IF (pole_nord) THEN 55 55 DO ij = 1,iip1 56 56 x( ij ,l ) = 0. 57 57 ENDDO 58 endif58 ENDIF 59 59 60 if(pole_sud) THEN60 IF (pole_sud) THEN 61 61 DO ij = 1,iip1 62 62 x( ij +ip1jm,l ) = 0. 63 63 ENDDO 64 endif64 ENDIF 65 65 ! 66 66 END DO -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgrad_loc.f90
r5116 r5117 27 27 ijb=ij_begin 28 28 ije=ij_end 29 if(pole_sud) ije=ij_end-iip129 IF (pole_sud) ije=ij_end-iip1 30 30 31 31 DO ij = ijb+1, ije … … 44 44 ije=ij_end+iip1 45 45 46 if(pole_nord) ijb=ij_begin+iip147 if(pole_sud) ije=ij_end-iip146 IF (pole_nord) ijb=ij_begin+iip1 47 IF (pole_sud) ije=ij_end-iip1 48 48 49 49 DO ij = ijb,ije … … 51 51 END DO 52 52 53 if(pole_nord) THEN53 IF (pole_nord) THEN 54 54 DO ij = 1,iip1 55 55 x( ij ,l ) = 0. 56 56 ENDDO 57 endif57 ENDIF 58 58 59 if(pole_sud) THEN59 IF (pole_sud) THEN 60 60 DO ij = 1,iip1 61 61 x( ij +ip1jm,l ) = 0. 62 62 ENDDO 63 endif63 ENDIF 64 64 ! 65 65 END DO -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgraro2_loc.f90
r5116 r5117 107 107 jjb=jj_begin 108 108 jje=jj_end 109 if(pole_sud) jje=jj_end-1109 IF (pole_sud) jje=jj_end-1 110 110 111 111 CALL filtreg_p( rot, jjb_v,jje_v, jjb,jje,jjm, & -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/parallel_lmdz.F90
r5116 r5117 5 5 USE mod_const_mpi 6 6 USE lmdz_mpi, ONLY: using_mpi 7 useIOIPSL7 USE IOIPSL 8 8 INTEGER,PARAMETER :: halo_max=3 9 9 … … 12 12 !$OMP THREADPRIVATE(is_master) 13 13 14 integer, save :: mpi_size15 integer, save :: mpi_rank16 integer, save :: jj_begin17 integer, save :: jj_end18 integer, save :: jj_nb19 integer, save :: ij_begin20 integer, save :: ij_end14 INTEGER, save :: mpi_size 15 INTEGER, save :: mpi_rank 16 INTEGER, save :: jj_begin 17 INTEGER, save :: jj_end 18 INTEGER, save :: jj_nb 19 INTEGER, save :: ij_begin 20 INTEGER, save :: ij_end 21 21 logical, save :: pole_nord 22 22 logical, save :: pole_sud 23 23 24 integer,save :: jjb_u25 integer,save :: jje_u26 integer,save :: jjnb_u27 integer,save :: jjb_v28 integer,save :: jje_v29 integer,save :: jjnb_v30 31 integer,save :: ijb_u32 integer,save :: ije_u33 integer,save :: ijnb_u34 35 integer,save :: ijb_v36 integer,save :: ije_v37 integer,save :: ijnb_v24 INTEGER,save :: jjb_u 25 INTEGER,save :: jje_u 26 INTEGER,save :: jjnb_u 27 INTEGER,save :: jjb_v 28 INTEGER,save :: jje_v 29 INTEGER,save :: jjnb_v 30 31 INTEGER,save :: ijb_u 32 INTEGER,save :: ije_u 33 INTEGER,save :: ijnb_u 34 35 INTEGER,save :: ijb_v 36 INTEGER,save :: ije_v 37 INTEGER,save :: ijnb_v 38 38 39 39 40 integer, allocatable, save, dimension(:) :: jj_begin_para41 integer, allocatable, save, dimension(:) :: jj_end_para42 integer, allocatable, save, dimension(:) :: jj_nb_para43 integer, save :: OMP_CHUNK44 integer, save :: omp_rank45 integer, save :: omp_size40 INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: jj_begin_para 41 INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: jj_end_para 42 INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: jj_nb_para 43 INTEGER, save :: OMP_CHUNK 44 INTEGER, save :: omp_rank 45 INTEGER, save :: omp_size 46 46 !$OMP THREADPRIVATE(omp_rank) 47 47 … … 53 53 INTEGER :: ij_end 54 54 55 integer:: jjb_u56 integer:: jje_u57 integer:: jjnb_u58 integer:: jjb_v59 integer:: jje_v60 integer :: jjnb_v55 INTEGER :: jjb_u 56 INTEGER :: jje_u 57 INTEGER :: jjnb_u 58 INTEGER :: jjb_v 59 INTEGER :: jje_v 60 INTEGER :: jjnb_v 61 61 62 integer:: ijb_u63 integer:: ije_u64 integer :: ijnb_u65 66 integer:: ijb_v67 integer:: ije_v68 integer :: ijnb_v62 INTEGER :: ijb_u 63 INTEGER :: ije_u 64 INTEGER :: ijnb_u 65 66 INTEGER :: ijb_v 67 INTEGER :: ije_v 68 INTEGER :: ijnb_v 69 69 70 70 71 integer, pointer :: jj_begin_para(:) => NULL()72 integer, pointer :: jj_end_para(:) => NULL()73 integer, pointer :: jj_nb_para(:) => NULL()71 INTEGER, pointer :: jj_begin_para(:) => NULL() 72 INTEGER, pointer :: jj_end_para(:) => NULL() 73 INTEGER, pointer :: jj_nb_para(:) => NULL() 74 74 END TYPE distrib 75 75 … … 82 82 83 83 SUBROUTINE init_parallel 84 USE vampir84 USE lmdz_vampir 85 85 USE lmdz_mpi 86 86 IMPLICIT NONE … … 92 92 INTEGER :: i,j 93 93 INTEGER :: type_size 94 integer, dimension(3) :: blocklen,type94 INTEGER, DIMENSION(3) :: blocklen,type 95 95 INTEGER :: comp_id 96 96 CHARACTER(LEN=4) :: num … … 122 122 123 123 ! Open text output file with mpi_rank in suffix of file name 124 IF (lunout /= 5 . and. lunout /= 6) THEN124 IF (lunout /= 5 .AND. lunout /= 6) THEN 125 125 WRITE(num,'(I4.4)') mpi_rank 126 126 filename='lmdz.out_'//num … … 138 138 do i=0,mpi_size-1 139 139 jj_nb_para(i)=(jjm+1)/mpi_size 140 if( i < MOD((jjm+1),mpi_size) ) jj_nb_para(i)=jj_nb_para(i)+1141 142 if(jj_nb_para(i) <= 1 ) THEN140 IF ( i < MOD((jjm+1),mpi_size) ) jj_nb_para(i)=jj_nb_para(i)+1 141 142 IF (jj_nb_para(i) <= 1 ) THEN 143 143 WRITE(lunout,*)"Arret : le nombre de bande de lattitude par process est trop faible (<2)." 144 144 WRITE(lunout,*)" ---> diminuez le nombre de CPU ou augmentez la taille en lattitude" … … 172 172 ij_end=jj_end*iip1 173 173 174 if(mpi_rank==0) THEN174 IF (mpi_rank==0) THEN 175 175 pole_nord=.TRUE. 176 176 else … … 178 178 endif 179 179 180 if(mpi_rank==mpi_size-1) THEN180 IF (mpi_rank==mpi_size-1) THEN 181 181 pole_sud=.TRUE. 182 182 else … … 233 233 CALL create_distrib(jj_nb_para,current_dist) 234 234 235 IF ((mpi_rank==0). and.(omp_rank==0)) THEN235 IF ((mpi_rank==0).AND.(omp_rank==0)) THEN 236 236 is_master=.TRUE. 237 237 ELSE … … 379 379 USE lmdz_mpi 380 380 ! ug Pour les sorties XIOS 381 USE wxios381 USE lmdz_wxios 382 382 383 383 #ifdef CPP_COUPLE 384 384 ! Use of Oasis-MCT coupler 385 385 #if defined CPP_OMCT 386 usemod_prism386 USE mod_prism 387 387 #else 388 usemod_prism_proto388 USE mod_prism_proto 389 389 #endif 390 390 ! Ehouarn: surface_data module is in 'phylmd' ... 391 usesurface_data, ONLY: type_ocean391 USE surface_data, ONLY: type_ocean 392 392 IMPLICIT NONE 393 393 #else … … 403 403 INTEGER :: i 404 404 405 if(allocated(jj_begin_para)) deallocate(jj_begin_para)406 if(allocated(jj_end_para)) deallocate(jj_end_para)407 if(allocated(jj_nb_para)) deallocate(jj_nb_para)408 409 if(type_ocean == 'couple') THEN405 IF (allocated(jj_begin_para)) deallocate(jj_begin_para) 406 IF (allocated(jj_end_para)) deallocate(jj_end_para) 407 IF (allocated(jj_nb_para)) deallocate(jj_nb_para) 408 409 IF (type_ocean == 'couple') THEN 410 410 #ifdef CPP_COUPLE 411 411 IF (using_xios) THEN … … 413 413 CALL wxios_close() 414 414 CALL prism_terminate_proto(ierr) 415 IF (ierr . ne. PRISM_Ok) THEN415 IF (ierr .NE. PRISM_Ok) THEN 416 416 CALL abort_gcm('Finalize_parallel',' Probleme dans prism_terminate_proto ',1) 417 417 ENDIF 418 418 ELSE 419 419 CALL prism_terminate_proto(ierr) 420 IF (ierr . ne. PRISM_Ok) THEN420 IF (ierr .NE. PRISM_Ok) THEN 421 421 CALL abort_gcm('Finalize_parallel',' Probleme dans prism_terminate_proto ',1) 422 422 endif … … 441 441 INCLUDE "paramet.h" 442 442 443 integer, intent(in) :: ij,ll,row444 real,dimension(ij,ll),intent(in) ::Field445 real,dimension(ll*iip1*row), intent(out) :: Buffer443 INTEGER, INTENT(IN) :: ij,ll,row 444 REAL,DIMENSION(ij,ll),INTENT(IN) ::Field 445 REAL,DIMENSION(ll*iip1*row), INTENT(OUT) :: Buffer 446 446 447 447 INTEGER :: Pos … … 464 464 INCLUDE "paramet.h" 465 465 466 integer, intent(in) :: ij,ll,row467 real,dimension(ij,ll),intent(out) ::Field468 real,dimension(ll*iip1*row), intent(in) :: Buffer466 INTEGER, INTENT(IN) :: ij,ll,row 467 REAL,DIMENSION(ij,ll),INTENT(OUT) ::Field 468 REAL,DIMENSION(ll*iip1*row), INTENT(IN) :: Buffer 469 469 470 470 INTEGER :: Pos … … 497 497 SUBROUTINE exchange_hallo(Field,ij,ll,up,down) 498 498 USE lmdz_mpi 499 USE Vampir499 USE lmdz_vampir 500 500 IMPLICIT NONE 501 501 INCLUDE "dimensions.h" 502 502 INCLUDE "paramet.h" 503 503 INTEGER :: ij,ll 504 REAL, dimension(ij,ll) :: Field504 REAL, DIMENSION(ij,ll) :: Field 505 505 INTEGER :: up,down 506 506 … … 512 512 513 513 INTEGER :: NbRequest 514 REAL, dimension(:),allocatable:: Buffer_Send_up,Buffer_Send_down515 REAL, dimension(:),allocatable:: Buffer_Recv_up,Buffer_Recv_down514 REAL, DIMENSION(:),ALLOCATABLE :: Buffer_Send_up,Buffer_Send_down 515 REAL, DIMENSION(:),ALLOCATABLE :: Buffer_Recv_up,Buffer_Recv_down 516 516 INTEGER :: Buffer_size 517 517 … … 537 537 ENDIF 538 538 539 if(up==0) THEN539 IF (up==0) THEN 540 540 SendDown=.FALSE. 541 541 RecvUp=.FALSE. 542 542 endif 543 543 544 if(down==0) THEN544 IF (down==0) THEN 545 545 SendUp=.FALSE. 546 546 RecvDown=.FALSE. … … 599 599 ENDIF 600 600 601 if(NbRequest > 0) CALL MPI_WAITALL(NbRequest,Request,Status,ierr)601 IF (NbRequest > 0) CALL MPI_WAITALL(NbRequest,Request,Status,ierr) 602 602 IF (RecvUp) CALL Unpack_Data(Field(ij_begin-up*iip1,1),ij,ll,up,Buffer_Recv_up) 603 603 IF (RecvDown) CALL Unpack_Data(Field(ij_end+1,1),ij,ll,down,Buffer_Recv_down) … … 620 620 INCLUDE "iniprint.h" 621 621 INTEGER :: ij,ll,rank 622 REAL, dimension(ij,ll) :: Field623 REAL, dimension(:),allocatable :: Buffer_send624 REAL, dimension(:),allocatable:: Buffer_Recv625 INTEGER, dimension(0:MPI_Size-1) :: Recv_count, displ622 REAL, DIMENSION(ij,ll) :: Field 623 REAL, DIMENSION(:),ALLOCATABLE :: Buffer_send 624 REAL, DIMENSION(:),ALLOCATABLE :: Buffer_Recv 625 INTEGER, DIMENSION(0:MPI_Size-1) :: Recv_count, displ 626 626 INTEGER :: ierr 627 627 INTEGER ::i … … 629 629 IF (using_mpi) THEN 630 630 631 if(ij==ip1jmp1) THEN631 IF (ij==ip1jmp1) THEN 632 632 allocate(Buffer_send(iip1*ll*(jj_end-jj_begin+1))) 633 633 CALL Pack_Data(Field(ij_begin,1),ij,ll,jj_end-jj_begin+1,Buffer_send) 634 else if(ij==ip1jm) THEN634 ELSE IF (ij==ip1jm) THEN 635 635 allocate(Buffer_send(iip1*ll*(min(jj_end,jjm)-jj_begin+1))) 636 636 CALL Pack_Data(Field(ij_begin,1),ij,ll,min(jj_end,jjm)-jj_begin+1,Buffer_send) … … 640 640 endif 641 641 642 if(MPI_Rank==rank) THEN642 IF (MPI_Rank==rank) THEN 643 643 allocate(Buffer_Recv(ij*ll)) 644 644 … … 646 646 do i=0,MPI_Size-1 647 647 648 if(ij==ip1jmp1) THEN648 IF (ij==ip1jmp1) THEN 649 649 Recv_count(i)=(jj_end_para(i)-jj_begin_para(i)+1)*ll*iip1 650 else if(ij==ip1jm) THEN650 ELSE IF (ij==ip1jm) THEN 651 651 Recv_count(i)=(min(jj_end_para(i),jjm)-jj_begin_para(i)+1)*ll*iip1 652 652 else … … 654 654 endif 655 655 656 if(i==0) THEN656 IF (i==0) THEN 657 657 displ(i)=0 658 658 else … … 674 674 !$OMP END CRITICAL (MPI) 675 675 676 if(MPI_Rank==rank) THEN677 if(ij==ip1jmp1) THEN676 IF (MPI_Rank==rank) THEN 677 IF (ij==ip1jmp1) THEN 678 678 do i=0,MPI_Size-1 679 679 CALL Unpack_Data(Field((jj_begin_para(i)-1)*iip1+1,1),ij,ll, & 680 680 jj_end_para(i)-jj_begin_para(i)+1,Buffer_Recv(displ(i)+1)) 681 681 enddo 682 else if(ij==ip1jm) THEN682 ELSE IF (ij==ip1jm) THEN 683 683 do i=0,MPI_Size-1 684 684 CALL Unpack_Data(Field((jj_begin_para(i)-1)*iip1+1,1),ij,ll, & … … 698 698 INCLUDE "paramet.h" 699 699 INTEGER :: ij,ll 700 REAL, dimension(ij,ll) :: Field700 REAL, DIMENSION(ij,ll) :: Field 701 701 INTEGER :: ierr 702 702 … … 716 716 INCLUDE "paramet.h" 717 717 INTEGER :: ij,ll 718 REAL, dimension(ij,ll) :: Field718 REAL, DIMENSION(ij,ll) :: Field 719 719 INTEGER :: rank 720 720 INTEGER :: ierr … … 737 737 738 738 ! INTEGER :: ij,ll 739 ! REAL, dimension(ij,ll) :: Field739 ! REAL, DIMENSION(ij,ll) :: Field 740 740 ! INTEGER :: up,down 741 741 742 ! REAL, dimension(ij,ll): NewField742 ! REAL,DIMENSION(ij,ll): NewField 743 743 744 744 ! NewField=0 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/pression_loc.f90
r5105 r5117 29 29 ije=ij_end+2*iip1 30 30 31 if(pole_nord) ijb=ij_begin32 if(pole_sud) ije=ij_end31 IF (pole_nord) ijb=ij_begin 32 IF (pole_sud) ije=ij_end 33 33 34 34 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/qminimum_loc.f90
r5116 r5117 6 6 USE infotrac, ONLY: niso, ntiso, iqIsoPha, tracers, & 7 7 isoCheck, min_qParent 8 USE strings_mod, ONLY: strIdx9 USE readTracFiles_mod, ONLY: addPhase8 USE lmdz_strings, ONLY: strIdx 9 USE lmdz_readTracFiles, ONLY: addPhase 10 10 IMPLICIT none 11 11 ! … … 87 87 !$OMP DO SCHEDULE(STATIC) 88 88 DO i = ijb, ije 89 if(seuil_liq - q(i,k,iq_liq) > 0.d0 ) THEN90 if(niso > 0) zx_defau_diag(i,k,2)=AMAX1 &89 IF (seuil_liq - q(i,k,iq_liq) > 0.d0 ) THEN 90 IF (niso > 0) zx_defau_diag(i,k,2)=AMAX1 & 91 91 ( seuil_liq - q(i,k,iq_liq), 0.0 ) 92 92 … … 108 108 DO i = ijb, ije 109 109 110 if( seuil_vap - q(i,k,iq_vap) > 0.d0 ) THEN111 if(niso > 0) zx_defau_diag(i,k,1) &110 IF ( seuil_vap - q(i,k,iq_vap) > 0.d0 ) THEN 111 IF (niso > 0) zx_defau_diag(i,k,1) & 112 112 = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 ) 113 113 … … 148 148 149 149 !WRITE(lunout,*) 'qminimum 128' 150 if(niso > 0) THEN150 IF (niso > 0) THEN 151 151 !WRITE(lunout,*) 'qminimum 140' 152 152 ! CRisi: traiter de même les traceurs d'eau … … 164 164 !$OMP DO SCHEDULE(STATIC) 165 165 DO i = ijb, ije 166 if(zx_pump(i)>0.0) THEN166 IF (zx_pump(i)>0.0) THEN 167 167 q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i) 168 168 endif !if (zx_pump(i).gt.0.0) THEN … … 175 175 !$OMP DO SCHEDULE(STATIC) 176 176 DO i = ijb, ije 177 if(zx_defau_diag(i,k,1)>0.0) THEN177 IF (zx_defau_diag(i,k,1)>0.0) THEN 178 178 ! on ajoute la vapeur en k 179 179 ! WRITE(lunout,*) 'i,k,q_follow(i,k-1,ivap)=', 180 180 ! : i,k,q_follow(i,k-1,1) 181 if(q_follow(i,k-1,1)<min_qParent) THEN181 IF (q_follow(i,k-1,1)<min_qParent) THEN 182 182 WRITE(lunout,*) 'tmp qmin: on stoppe' 183 183 WRITE(lunout,*) 'zx_pump(i)=',zx_pump(i) … … 200 200 *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1) 201 201 202 if(isoCheck) THEN202 IF (isoCheck) THEN 203 203 IF(iso_verif_noNaN_nostop(q(i,k,iqIsoPha(ixt,iq_vap)), & 204 204 'qminimum 155')==1) THEN … … 224 224 /q_follow(i,k-1,1) 225 225 226 if(isoCheck) THEN227 if(iso_verif_noNaN_nostop( &226 IF (isoCheck) THEN 227 IF (iso_verif_noNaN_nostop( & 228 228 q(i,k-1,iqIsoPha(ixt,iq_vap)), & 229 229 'qminimum 175')==1) THEN … … 260 260 !$OMP DO SCHEDULE(STATIC) 261 261 DO i = ijb, ije 262 if(zx_defau_diag(i,k,2)>0.0) THEN262 IF (zx_defau_diag(i,k,2)>0.0) THEN 263 263 ! on ajoute eau liquide en k en k 264 264 do ixt=1,ntiso … … 282 282 CALL check_isotopes(q,ijb,ije,'qminimum 197') 283 283 284 endif!if (niso > 0) THEN284 ENDIF !if (niso > 0) THEN 285 285 !WRITE(*,*) 'qminimum 188' 286 286 !$OMP BARRIER -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/rotatf_loc.f90
r5116 r5117 53 53 jjb=jj_begin 54 54 jje=jj_end 55 if(pole_sud) jje=jj_end-155 IF (pole_sud) jje=jj_end-1 56 56 CALL filtreg_p( rot, jjb_v, jje_v,jjb,jje,jjm, & 57 57 klevel, 2, 2, .FALSE., 1 ) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/sw_case_williamson91_6_loc.f90
r5116 r5117 53 53 ! ------ 54 54 55 real,allocatable:: ucov_glo(:,:)56 real,allocatable:: vcov_glo(:,:)57 real,allocatable:: teta_glo(:,:)58 real,allocatable:: masse_glo(:,:)59 real,allocatable:: ps_glo(:)55 REAL,ALLOCATABLE :: ucov_glo(:,:) 56 REAL,ALLOCATABLE :: vcov_glo(:,:) 57 REAL,ALLOCATABLE :: teta_glo(:,:) 58 REAL,ALLOCATABLE :: masse_glo(:,:) 59 REAL,ALLOCATABLE :: ps_glo(:) 60 60 61 61 ! REAL p (ip1jmp1,llmp1 ) ! pression aux interfac.des couches … … 65 65 ! REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm) 66 66 67 real,allocatable:: p(:,:)68 real,allocatable:: pks(:)69 real,allocatable:: pk(:,:)70 real,allocatable:: pkf(:,:)71 real,allocatable:: alpha(:,:),beta(:,:)67 REAL,ALLOCATABLE :: p(:,:) 68 REAL,ALLOCATABLE :: pks(:) 69 REAL,ALLOCATABLE :: pk(:,:) 70 REAL,ALLOCATABLE :: pkf(:,:) 71 REAL,ALLOCATABLE :: alpha(:,:),beta(:,:) 72 72 73 73 REAL :: sinth,costh,costh2, Ath,Bth,Cth, lon,dps -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/times.F90
r5116 r5117 1 1 module times 2 integer,PRIVATE,save :: Last_Count=03 real, PRIVATE,save :: Last_cpuCount=02 INTEGER,PRIVATE,save :: Last_Count=0 3 REAL, PRIVATE,save :: Last_cpuCount=0 4 4 logical, PRIVATE,save :: AllTimer_IsActive=.FALSE. 5 5 6 integer, parameter :: nb_timer = 47 integer, parameter :: timer_caldyn = 18 integer, parameter :: timer_vanleer = 29 integer, parameter :: timer_dissip = 310 integer, parameter :: timer_physic = 411 integer, parameter :: stopped = 112 integer, parameter :: running = 213 integer, parameter :: suspended = 36 INTEGER, parameter :: nb_timer = 4 7 INTEGER, parameter :: timer_caldyn = 1 8 INTEGER, parameter :: timer_vanleer = 2 9 INTEGER, parameter :: timer_dissip = 3 10 INTEGER, parameter :: timer_physic = 4 11 INTEGER, parameter :: stopped = 1 12 INTEGER, parameter :: running = 2 13 INTEGER, parameter :: suspended = 3 14 14 15 15 INTEGER :: max_size 16 real, allocatable, dimension(:,:,:) :: timer_table17 real, allocatable, dimension(:,:,:) :: timer_table_sqr18 integer, allocatable, dimension(:,:,:) :: timer_iteration19 real, allocatable, dimension(:,:,:) :: timer_average20 real, allocatable, dimension(:,:,:) :: timer_delta21 real, allocatable,dimension(:) :: timer_running, last_time22 integer, allocatable,dimension(:) :: timer_state16 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: timer_table 17 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: timer_table_sqr 18 INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: timer_iteration 19 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: timer_average 20 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: timer_delta 21 REAL, ALLOCATABLE,DIMENSION(:) :: timer_running, last_time 22 INTEGER, ALLOCATABLE,DIMENSION(:) :: timer_state 23 23 24 24 contains … … 52 52 INTEGER :: no_timer 53 53 54 if(AllTimer_IsActive) THEN55 if(timer_state(no_timer)/=stopped) THEN54 IF (AllTimer_IsActive) THEN 55 IF (timer_state(no_timer)/=stopped) THEN 56 56 CALL abort_gcm("times","start_timer :: timer is already running or suspended",1) 57 57 else … … 70 70 INTEGER :: no_timer 71 71 72 if(AllTimer_IsActive) THEN73 if(timer_state(no_timer)/=running) THEN72 IF (AllTimer_IsActive) THEN 73 IF (timer_state(no_timer)/=running) THEN 74 74 CALL abort_gcm("times","suspend_timer :: timer is not running",1) 75 75 else … … 87 87 INTEGER :: no_timer 88 88 89 if(AllTimer_IsActive) THEN90 if(timer_state(no_timer)/=suspended) THEN89 IF (AllTimer_IsActive) THEN 90 IF (timer_state(no_timer)/=suspended) THEN 91 91 CALL abort_gcm("times","resume_timer :: timer is not suspended",1) 92 92 else … … 106 106 REAL :: V,V2 107 107 108 if(AllTimer_IsActive) THEN109 if(timer_state(no_timer)/=running) THEN108 IF (AllTimer_IsActive) THEN 109 IF (timer_state(no_timer)/=running) THEN 110 110 CALL abort_gcm("times","stop_timer :: timer is not running",1) 111 111 else … … 121 121 timer_iteration(jj_nb,no_timer,mpi_rank)=timer_iteration(jj_nb,no_timer,mpi_rank)+1 122 122 timer_average(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)/timer_iteration(jj_nb,no_timer,mpi_rank) 123 if(timer_iteration(jj_nb,no_timer,mpi_rank)>=2) THEN123 IF (timer_iteration(jj_nb,no_timer,mpi_rank)>=2) THEN 124 124 N=timer_iteration(jj_nb,no_timer,mpi_rank) 125 125 V2=timer_table_sqr(jj_nb,no_timer,mpi_rank) … … 140 140 INTEGER :: ierr 141 141 INTEGER :: data_size 142 real, allocatable,dimension(:,:) :: tmp_table142 REAL, ALLOCATABLE,DIMENSION(:,:) :: tmp_table 143 143 144 144 IF (using_mpi) THEN 145 145 146 if(AllTimer_IsActive) THEN146 IF (AllTimer_IsActive) THEN 147 147 allocate(tmp_table(max_size,nb_timer)) 148 148 … … 167 167 INTEGER :: ierr 168 168 INTEGER :: data_size 169 real, allocatable,dimension(:,:),target :: tmp_table170 integer, allocatable,dimension(:,:),target :: tmp_iter169 REAL, ALLOCATABLE,DIMENSION(:,:),target :: tmp_table 170 INTEGER, ALLOCATABLE,DIMENSION(:,:),target :: tmp_iter 171 171 INTEGER :: istats 172 172 173 173 IF (using_mpi) THEN 174 174 175 if(AllTimer_IsActive) THEN175 IF (AllTimer_IsActive) THEN 176 176 allocate(tmp_table(max_size,nb_timer)) 177 177 allocate(tmp_iter(max_size,nb_timer)) … … 197 197 198 198 AllTimer_IsActive=.TRUE. 199 if(AllTimer_IsActive) THEN199 IF (AllTimer_IsActive) THEN 200 200 CALL system_clock(count,count_rate,count_max) 201 201 CALL cpu_time(Last_cpuCount) … … 210 210 211 211 CALL system_clock(count,count_rate,count_max) 212 if(Count>=Last_Count) THEN212 IF (Count>=Last_Count) THEN 213 213 DiffTime=(1.*(Count-last_Count))/count_rate 214 214 else -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/top_bound_loc.f90
r5116 r5117 60 60 ! ---------- 61 61 62 real,intent(inout) :: ucov(iip1,jjb_u:jje_u,llm) ! covariant zonal wind63 real,intent(inout) :: vcov(iip1,jjb_v:jje_v,llm) ! covariant meridional wind64 real,intent(inout) :: teta(iip1,jjb_u:jje_u,llm) ! potential temperature65 real,intent(in) :: masse(iip1,jjb_u:jje_u,llm) ! mass of atmosphere66 real,intent(in) :: dt ! time step (s) of sponge model62 REAL,INTENT(INOUT) :: ucov(iip1,jjb_u:jje_u,llm) ! covariant zonal wind 63 REAL,INTENT(INOUT) :: vcov(iip1,jjb_v:jje_v,llm) ! covariant meridional wind 64 REAL,INTENT(INOUT) :: teta(iip1,jjb_u:jje_u,llm) ! potential temperature 65 REAL,INTENT(IN) :: masse(iip1,jjb_u:jje_u,llm) ! mass of atmosphere 66 REAL,INTENT(IN) :: dt ! time step (s) of sponge model 67 67 68 68 ! REAL dv(iip1,jjb_v:jje_v,llm),du(iip1,jjb_u:jje_u,llm) … … 78 78 INTEGER :: i 79 79 REAL,SAVE :: rdamp(llm) 80 real,save :: lambda(llm) ! inverse or quenching time scale (Hz)80 REAL,save :: lambda(llm) ! inverse or quenching time scale (Hz) 81 81 LOGICAL,SAVE :: first=.TRUE. 82 82 INTEGER :: j,l,jjb,jje 83 83 84 84 85 if(iflag_top_bound == 0) return86 87 if(first) THEN85 IF (iflag_top_bound == 0) return 86 87 IF (first) THEN 88 88 !$OMP BARRIER 89 89 !$OMP MASTER 90 if(iflag_top_bound == 1) THEN90 IF (iflag_top_bound == 1) THEN 91 91 ! sponge quenching over the topmost 4 atmospheric layers 92 92 lambda(:)=0. … … 95 95 lambda(llm-2)=tau_top_bound/4. 96 96 lambda(llm-3)=tau_top_bound/8. 97 else if(iflag_top_bound == 2) THEN97 ELSE IF (iflag_top_bound == 2) THEN 98 98 ! sponge quenching over topmost layers down to pressures which are 99 99 ! higher than 100 times the topmost layer pressure … … 110 110 WRITE(lunout,*)'p (Pa) z(km) tau(s) 1./tau (Hz)' 111 111 do l=1,llm 112 if(rdamp(l)/=0.) THEN112 IF (rdamp(l)/=0.) THEN 113 113 WRITE(lunout,'(6(1pe12.4,1x))') & 114 114 presnivs(l),log(preff/presnivs(l))*scaleheight, & … … 119 119 !$OMP END MASTER 120 120 !$OMP BARRIER 121 endif! of if (first)121 ENDIF ! of if (first) 122 122 123 123 … … 125 125 126 126 ! compute zonal average of vcov (or set it to zero) 127 if(mode_top_bound>=2) THEN127 IF (mode_top_bound>=2) THEN 128 128 jjb=jj_begin 129 129 jje=jj_end … … 150 150 enddo 151 151 !$OMP END DO NOWAIT 152 endif! of if (mode_top_bound.ge.2)152 ENDIF ! of if (mode_top_bound.ge.2) 153 153 154 154 ! compute zonal average of u (or set it to zero) 155 if(mode_top_bound>=2) THEN155 IF (mode_top_bound>=2) THEN 156 156 jjb=jj_begin 157 157 jje=jj_end … … 177 177 enddo 178 178 !$OMP END DO NOWAIT 179 endif! of if (mode_top_bound.ge.2)179 ENDIF ! of if (mode_top_bound.ge.2) 180 180 181 181 ! compute zonal average of potential temperature, if necessary 182 if(mode_top_bound>=3) THEN182 IF (mode_top_bound>=3) THEN 183 183 jjb=jj_begin 184 184 jje=jj_end … … 198 198 enddo 199 199 !$OMP END DO NOWAIT 200 endif! of if (mode_top_bound.ge.3)201 202 if(mode_top_bound>=1) THEN200 ENDIF ! of if (mode_top_bound.ge.3) 201 202 IF (mode_top_bound>=1) THEN 203 203 ! Apply sponge quenching on vcov: 204 204 jjb=jj_begin … … 233 233 enddo 234 234 !$OMP END DO NOWAIT 235 endif! of if (mode_top_bound.ge.1)236 237 if(mode_top_bound>=3) THEN235 ENDIF ! of if (mode_top_bound.ge.1) 236 237 IF (mode_top_bound>=3) THEN 238 238 ! Apply sponge quenching on teta: 239 239 jjb=jj_begin … … 252 252 enddo 253 253 !$OMP END DO NOWAIT 254 endif! of if (mode_top_bond.ge.3)254 ENDIF ! of if (mode_top_bond.ge.3) 255 255 256 256 END SUBROUTINE top_bound_loc -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlsplt_loc.f90
r5116 r5117 60 60 ije = ije_x 61 61 62 if (pole_nord.and.ijb==1) ijb = ijb + iip163 if (pole_sud.and.ije==ip1jmp1) ije = ije - iip162 IF (pole_nord.AND.ijb==1) ijb = ijb + iip1 63 IF (pole_sud.AND.ije==ip1jmp1) ije = ije - iip1 64 64 65 65 IF (pente_max>-1.e-5) THEN … … 238 238 ! indicage des mailles concernees par le traitement special 239 239 DO ij = ijb, ije 240 IF(iadvplus(ij, l)==1. and.mod(ij, iip1)/=0) THEN240 IF(iadvplus(ij, l)==1.AND.mod(ij, iip1)/=0) THEN 241 241 iju = iju + 1 242 242 indu(iju) = ij … … 313 313 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 314 314 masse(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) 315 if(q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020315 IF (q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020 316 316 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 317 317 else … … 440 440 ijb = ij_begin - 2 * iip1 441 441 ije = ij_end + 2 * iip1 442 if(pole_nord) ijb = ij_begin443 if(pole_sud) ije = ij_end442 IF (pole_nord) ijb = ij_begin 443 IF (pole_sud) ije = ij_end 444 444 445 445 IF(first) THEN … … 474 474 ! le pole nord) qui sera utilisee pour evaluer les pentes au pole. 475 475 476 if(pole_nord) THEN476 IF (pole_nord) THEN 477 477 DO i = 1, iim 478 478 airescb(i) = aire(i + iip1) * q(i + iip1, l, iq) … … 481 481 endif 482 482 483 if(pole_sud) THEN483 IF (pole_sud) THEN 484 484 DO i = 1, iim 485 485 airesch(i) = aire(i + ip1jm - iip1) * q(i + ip1jm - iip1, l, iq) … … 492 492 ijb = ij_begin - 2 * iip1 493 493 ije = ij_end + iip1 494 if(pole_nord) ijb = ij_begin495 if(pole_sud) ije = ij_end - iip1494 IF (pole_nord) ijb = ij_begin 495 IF (pole_sud) ije = ij_end - iip1 496 496 497 497 ! on a besoin de q entre ij_begin-2*iip1 et ij_end+2*iip1 … … 507 507 ijb = ij_begin - iip1 508 508 ije = ij_end + iip1 509 if(pole_nord) ijb = ij_begin + iip1510 if(pole_sud) ije = ij_end - iip1509 IF (pole_nord) ijb = ij_begin + iip1 510 IF (pole_sud) ije = ij_end - iip1 511 511 512 512 DO ij = ijb, ije … … 654 654 ijb = ij_begin - iip1 655 655 ije = ij_end + iip1 656 if(pole_nord) ijb = ij_begin + iip1657 if(pole_sud) ije = ij_end - iip1656 IF (pole_nord) ijb = ij_begin + iip1 657 IF (pole_sud) ije = ij_end - iip1 658 658 659 659 DO ij = ijb, ije … … 670 670 ijb = ij_begin - iip1 671 671 ije = ij_end 672 if(pole_nord) ijb = ij_begin673 if(pole_sud) ije = ij_end - iip1672 IF (pole_nord) ijb = ij_begin 673 IF (pole_sud) ije = ij_end - iip1 674 674 675 675 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 697 697 ijbm = ij_begin - iip1 698 698 ijem = ij_end + iip1 699 if(pole_nord) ijb = ij_begin700 if(pole_sud) ije = ij_end701 if(pole_nord) ijbm = ij_begin702 if(pole_sud) ijem = ij_end699 IF (pole_nord) ijb = ij_begin 700 IF (pole_sud) ije = ij_end 701 IF (pole_nord) ijbm = ij_begin 702 IF (pole_sud) ijem = ij_end 703 703 704 704 do ifils = 1, tracers(iq)%nqDescen … … 716 716 DO ij = ijb, ije 717 717 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 718 if(q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020718 IF (q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020 719 719 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 720 720 else … … 734 734 ijb = ij_begin 735 735 ije = ij_end 736 if(pole_nord) ijb = ij_begin + iip1737 if(pole_sud) ije = ij_end - iip1736 IF (pole_nord) ijb = ij_begin + iip1 737 IF (pole_sud) ije = ij_end - iip1 738 738 739 739 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 750 750 ENDDO 751 751 752 if(pole_nord) THEN752 IF (pole_nord) THEN 753 753 convpn = SSUM(iim, qbyv(1, l), 1) 754 754 convmpn = ssum(iim, masse_adv_v(1, l), 1) … … 764 764 endif 765 765 766 if(pole_sud) THEN766 IF (pole_sud) THEN 767 767 convps = -SSUM(iim, qbyv(ip1jm - iim, l), 1) 768 768 convmps = -ssum(iim, masse_adv_v(ip1jm - iim, l), 1) … … 1014 1014 ! CRisi 24nov2020: ajout d'un message d'erreur clair au lieu d'un plantage 1015 1015 ! pour seg fault 1016 if(lorig(ij, l)==0) THEN1016 IF (lorig(ij, l)==0) THEN 1017 1017 CALL abort_gcm("vlz in vlsplt_loc", & 1018 1018 "unfixable violation of CFL", 1) … … 1065 1065 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 1066 1066 masse(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) 1067 if(q(ij, l, iq)>min_qParent) THEN1067 IF (q(ij, l, iq)>min_qParent) THEN 1068 1068 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 1069 1069 else -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltgen_loc.F90
r5116 r5117 25 25 USE mod_hallo 26 26 USE write_field_loc, ONLY: WriteField_u, WriteField_v 27 USE VAMPIR27 USE lmdz_vampir 28 28 ! CRisi: on rajoute variables utiles d'infotrac 29 29 USE infotrac, ONLY: nqtot, tracers, isoCheck … … 97 97 ijb = ij_begin - iip1 98 98 ije = ij_end + iip1 99 if(pole_nord) ijb = ij_begin100 if(pole_sud) ije = ij_end99 IF (pole_nord) ijb = ij_begin 100 IF (pole_sud) ije = ij_end 101 101 102 102 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 124 124 ijb = ij_begin 125 125 ije = ij_end 126 if(pole_nord) ijb = ijb + iip1127 if(pole_sud) ije = ije - iip1126 IF (pole_nord) ijb = ijb + iip1 127 IF (pole_sud) ije = ije - iip1 128 128 129 129 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 137 137 ijb = ij_begin - iip1 138 138 ije = ij_end 139 if(pole_nord) ijb = ij_begin140 if(pole_sud) ije = ij_end - iip1139 IF (pole_nord) ijb = ij_begin 140 IF (pole_sud) ije = ij_end - iip1 141 141 142 142 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 253 253 ijb = ij_begin - 2 * iip1 254 254 ije = ij_end + 2 * iip1 255 if(pole_nord) ijb = ij_begin256 if(pole_sud) ije = ij_end255 IF (pole_nord) ijb = ij_begin 256 IF (pole_sud) ije = ij_end 257 257 CALL check_isotopes(zq, ij_begin, ij_end, 'vlspltgen_loc 280') 258 258 … … 290 290 ijb = ij_begin - 2 * iip1 291 291 ije = ij_end + 2 * iip1 292 if(pole_nord) ijb = ij_begin293 if(pole_sud) ije = ij_end292 IF (pole_nord) ijb = ij_begin 293 IF (pole_sud) ije = ij_end 294 294 CALL check_isotopes(zq, ijb, ije, 'vlspltgen_loc 336') 295 295 END IF -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltqs_loc.f90
r5116 r5117 59 59 ije=ije_x 60 60 61 if (pole_nord.and.ijb==1) ijb=ijb+iip162 if (pole_sud.and.ije==ip1jmp1) ije=ije-iip161 IF (pole_nord.AND.ijb==1) ijb=ijb+iip1 62 IF (pole_sud.AND.ije==ip1jmp1) ije=ije-iip1 63 63 64 64 IF (pente_max>-1.e-5) THEN … … 157 157 !$OMP END DO NOWAIT 158 158 159 if(pole_nord) THEN159 IF (pole_nord) THEN 160 160 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 161 161 DO l=1,llm … … 163 163 ENDDO 164 164 !$OMP END DO NOWAIT 165 endif166 167 if(pole_sud) THEN165 ENDIF 166 167 IF (pole_sud) THEN 168 168 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 169 169 DO l=1,llm … … 171 171 ENDDO 172 172 !$OMP END DO NOWAIT 173 endif173 ENDIF 174 174 175 175 ! calcul des flux a gauche et a droite … … 247 247 ! indicage des mailles concernees par le traitement special 248 248 DO ij=ijb,ije 249 IF(iadvplus(ij,l)==1. and.mod(ij,iip1)/=0) THEN249 IF(iadvplus(ij,l)==1.AND.mod(ij,iip1)/=0) THEN 250 250 iju=iju+1 251 251 indu(iju)=ij … … 319 319 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 320 320 masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass) 321 if(q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020321 IF (q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020 322 322 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 323 323 else … … 448 448 ijb=ij_begin-2*iip1 449 449 ije=ij_end+2*iip1 450 if(pole_nord) ijb=ij_begin451 if(pole_sud) ije=ij_end450 IF (pole_nord) ijb=ij_begin 451 IF (pole_sud) ije=ij_end 452 452 ij=3525 453 453 l=3 454 if ((ij>=ijb).and.(ij<=ije)) THEN454 IF ((ij>=ijb).AND.(ij<=ije)) THEN 455 455 !WRITE(*,*) 'vlyqs 480: ij,l,iq,ijb,q(ij,l,:)=', 456 456 ! & ij,l,iq,ijb,q(ij,l,:) 457 endif457 ENDIF 458 458 459 459 IF(first) THEN … … 488 488 ! le pole nord) qui sera utilisee pour evaluer les pentes au pole. 489 489 490 if(pole_nord) THEN490 IF (pole_nord) THEN 491 491 DO i = 1, iim 492 492 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 493 493 ENDDO 494 494 qpns = SSUM( iim, airescb ,1 ) / airej2 495 endif496 497 if(pole_sud) THEN495 ENDIF 496 497 IF (pole_sud) THEN 498 498 DO i = 1, iim 499 499 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 500 500 ENDDO 501 501 qpsn = SSUM( iim, airesch ,1 ) / airejjm 502 endif502 ENDIF 503 503 504 504 … … 507 507 ijb=ij_begin-2*iip1 508 508 ije=ij_end+iip1 509 if(pole_nord) ijb=ij_begin510 if(pole_sud) ije=ij_end-iip1509 IF (pole_nord) ijb=ij_begin 510 IF (pole_sud) ije=ij_end-iip1 511 511 512 512 DO ij=ijb,ije … … 520 520 ijb=ij_begin-iip1 521 521 ije=ij_end+iip1 522 if(pole_nord) ijb=ij_begin+iip1523 if(pole_sud) ije=ij_end-iip1522 IF (pole_nord) ijb=ij_begin+iip1 523 IF (pole_sud) ije=ij_end-iip1 524 524 525 525 DO ij=ijb,ije … … 664 664 ijb=ij_begin-iip1 665 665 ije=ij_end+iip1 666 if(pole_nord) ijb=ij_begin+iip1667 if(pole_sud) ije=ij_end-iip1666 IF (pole_nord) ijb=ij_begin+iip1 667 IF (pole_sud) ije=ij_end-iip1 668 668 669 669 DO ij=ijb,ije … … 680 680 ijb=ij_begin-iip1 681 681 ije=ij_end 682 if(pole_nord) ijb=ij_begin683 if(pole_sud) ije=ij_end-iip1682 IF (pole_nord) ijb=ij_begin 683 IF (pole_sud) ije=ij_end-iip1 684 684 685 685 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 708 708 ijbm=ij_begin-iip1 709 709 ijem=ij_end+iip1 710 if(pole_nord) ijb=ij_begin711 if(pole_sud) ije=ij_end712 if(pole_nord) ijbm=ij_begin713 if(pole_sud) ijem=ij_end710 IF (pole_nord) ijb=ij_begin 711 IF (pole_sud) ije=ij_end 712 IF (pole_nord) ijbm=ij_begin 713 IF (pole_sud) ijem=ij_end 714 714 715 715 !WRITE(lunout,*) 'vlspltqs 737: iq,ijb,ije=',iq,ijb,ije … … 731 731 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 732 732 !WRITE(lunout,*) 'ij,l,q(ij,l,iq)=',ij,l,q(ij,l,iq) 733 if(q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020733 IF (q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020 734 734 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 735 735 else … … 751 751 ijb=ij_begin 752 752 ije=ij_end 753 if(pole_nord) ijb=ij_begin+iip1754 if(pole_sud) ije=ij_end-iip1753 IF (pole_nord) ijb=ij_begin+iip1 754 IF (pole_sud) ije=ij_end-iip1 755 755 756 756 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/wrgrads.f90
r5116 r5117 24 24 INTEGER :: im, jm, lm, i, j, l, iv, iii, iji, iif, ijf 25 25 26 logical:: writectl26 LOGICAL :: writectl 27 27 28 28 writectl = .FALSE. … … 63 63 else 64 64 ivar(if) = mod(ivar(if), nvar(if)) + 1 65 if(ivar(if)==nvar(if)) THEN65 IF (ivar(if)==nvar(if)) THEN 66 66 writectl = .TRUE. 67 67 itime(if) = itime(if) + 1 … … 77 77 CALL abort_gcm("wrgrads", "problem", 1) 78 78 endif 79 endif79 ENDIF 80 80 81 81 PRINT*, 'ivar(if),nvar(if),var(ivar(if),if),writectl' … … 90 90 , i = iii, iif), j = iji, ijf) 91 91 enddo 92 if(writectl) THEN92 IF (writectl) THEN 93 93 file = fichier(if) 94 94 ! WARNING! on reecrase le fichier .ctl a chaque ecriture … … 118 118 close(unit(if)) 119 119 120 endif! writectl120 ENDIF ! writectl 121 121 122 122 END SUBROUTINE wrgrads -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/write_field_loc.F90
r5116 r5117 14 14 SUBROUTINE write_field1D_u(name,Field) 15 15 CHARACTER(LEN=*) :: name 16 real, dimension(:) :: Field16 REAL, DIMENSION(:) :: Field 17 17 18 18 CALL write_field_u_gen(name,Field,1) … … 24 24 25 25 CHARACTER(LEN=*) :: name 26 real, dimension(:,:) :: Field26 REAL, DIMENSION(:,:) :: Field 27 27 INTEGER :: ll 28 28 … … 35 35 SUBROUTINE write_field_u_gen(name,Field,ll) 36 36 USE parallel_lmdz 37 USE write_field37 USE lmdz_write_field 38 38 USE mod_hallo 39 39 IMPLICIT NONE … … 42 42 43 43 CHARACTER(LEN=*) :: name 44 real, dimension(ijb_u:ije_u,ll) :: Field45 real, allocatable,SAVE :: New_Field(:,:,:)46 integer,dimension(0:mpi_size-1) :: jj_nb_master44 REAL, DIMENSION(ijb_u:ije_u,ll) :: Field 45 REAL, ALLOCATABLE,SAVE :: New_Field(:,:,:) 46 INTEGER,DIMENSION(0:mpi_size-1) :: jj_nb_master 47 47 type(Request),SAVE :: Request_write 48 48 !$OMP THREADPRIVATE(Request_write) … … 70 70 71 71 !$OMP MASTER 72 if(MPI_Rank==0) CALL WriteField(name,New_Field)72 IF (MPI_Rank==0) CALL WriteField(name,New_Field) 73 73 DEALLOCATE(New_Field) 74 74 !$OMP END MASTER … … 79 79 SUBROUTINE write_field1D_v(name,Field) 80 80 CHARACTER(LEN=*) :: name 81 real, dimension(:) :: Field81 REAL, DIMENSION(:) :: Field 82 82 83 83 CALL write_field_v_gen(name,Field,1) … … 89 89 90 90 CHARACTER(LEN=*) :: name 91 real, dimension(:,:) :: Field91 REAL, DIMENSION(:,:) :: Field 92 92 INTEGER :: ll 93 93 … … 100 100 SUBROUTINE write_field_v_gen(name,Field,ll) 101 101 USE parallel_lmdz 102 USE write_field102 USE lmdz_write_field 103 103 USE mod_hallo 104 104 IMPLICIT NONE … … 107 107 108 108 CHARACTER(LEN=*) :: name 109 real, dimension(ijb_v:ije_v,ll) :: Field110 real, allocatable,SAVE :: New_Field(:,:,:)111 integer,dimension(0:mpi_size-1) :: jj_nb_master109 REAL, DIMENSION(ijb_v:ije_v,ll) :: Field 110 REAL, ALLOCATABLE,SAVE :: New_Field(:,:,:) 111 INTEGER,DIMENSION(0:mpi_size-1) :: jj_nb_master 112 112 type(Request),SAVE :: Request_write 113 113 !$OMP THREADPRIVATE(Request_write) … … 146 146 147 147 !$OMP MASTER 148 if(MPI_Rank==0) CALL WriteField(name,New_Field)148 IF (MPI_Rank==0) CALL WriteField(name,New_Field) 149 149 DEALLOCATE(New_Field) 150 150 !$OMP END MASTER -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/write_field_p.F90
r5116 r5117 10 10 SUBROUTINE write_field1D_p(name,Field) 11 11 USE parallel_lmdz 12 USE write_field12 USE lmdz_write_field 13 13 IMPLICIT NONE 14 14 15 integer, parameter :: MaxDim=115 INTEGER, parameter :: MaxDim=1 16 16 CHARACTER(LEN=*) :: name 17 real, dimension(:) :: Field18 real, dimension(:),allocatable:: New_Field19 integer, dimension(MaxDim) :: Dim17 REAL, DIMENSION(:) :: Field 18 REAL, DIMENSION(:),ALLOCATABLE :: New_Field 19 INTEGER, DIMENSION(MaxDim) :: Dim 20 20 21 21 … … 25 25 CALL Gather_Field(New_Field,dim(1),1,0) 26 26 27 if(MPI_Rank==0) CALL WriteField(name,New_Field)27 IF (MPI_Rank==0) CALL WriteField(name,New_Field) 28 28 29 29 END SUBROUTINE write_field1D_p … … 31 31 SUBROUTINE write_field2D_p(name,Field) 32 32 USE parallel_lmdz 33 USE write_field33 USE lmdz_write_field 34 34 IMPLICIT NONE 35 35 36 integer, parameter :: MaxDim=236 INTEGER, parameter :: MaxDim=2 37 37 CHARACTER(LEN=*) :: name 38 real, dimension(:,:) :: Field39 real, dimension(:,:),allocatable:: New_Field40 integer, dimension(MaxDim) :: Dim38 REAL, DIMENSION(:,:) :: Field 39 REAL, DIMENSION(:,:),ALLOCATABLE :: New_Field 40 INTEGER, DIMENSION(MaxDim) :: Dim 41 41 42 42 Dim=shape(Field) … … 45 45 CALL Gather_Field(New_Field(1,1),dim(1)*dim(2),1,0) 46 46 47 if(MPI_Rank==0) CALL WriteField(name,New_Field)47 IF (MPI_Rank==0) CALL WriteField(name,New_Field) 48 48 49 49 … … 52 52 SUBROUTINE write_field3D_p(name,Field) 53 53 USE parallel_lmdz 54 USE write_field54 USE lmdz_write_field 55 55 IMPLICIT NONE 56 56 57 integer, parameter :: MaxDim=357 INTEGER, parameter :: MaxDim=3 58 58 CHARACTER(LEN=*) :: name 59 real, dimension(:,:,:) :: Field60 real, dimension(:,:,:),allocatable:: New_Field61 integer, dimension(MaxDim) :: Dim59 REAL, DIMENSION(:,:,:) :: Field 60 REAL, DIMENSION(:,:,:),ALLOCATABLE :: New_Field 61 INTEGER, DIMENSION(MaxDim) :: Dim 62 62 63 63 Dim=shape(Field) … … 66 66 CALL Gather_Field(New_Field(1,1,1),dim(1)*dim(2),dim(3),0) 67 67 68 if(MPI_Rank==0) CALL WriteField(name,New_Field)68 IF (MPI_Rank==0) CALL WriteField(name,New_Field) 69 69 70 70 END SUBROUTINE write_field3D_p -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writedyn_xios.F90
r5116 r5117 8 8 USE misc_mod 9 9 USE infotrac, ONLY: nqtot 10 usecom_io_dyn_mod, ONLY: histaveid, histvaveid, histuaveid10 USE com_io_dyn_mod, ONLY: histaveid, histvaveid, histuaveid 11 11 USE comconst_mod, ONLY: cpp 12 12 USE temps_mod, ONLY: itau_dyn … … 47 47 REAL phis(ijb_u:ije_u) 48 48 REAL q(ijb_u:ije_u, llm, nqtot) 49 integertime49 INTEGER time 50 50 51 51 … … 57 57 REAL, SAVE, ALLOCATABLE :: vnat(:, :), unat(:, :) 58 58 REAL, SAVE, ALLOCATABLE :: vbuffer(:, :) 59 logicalok_sync60 integeritau_w59 LOGICAL ok_sync 60 INTEGER itau_w 61 61 INTEGER :: ijb, ije, jjn 62 62 LOGICAL, SAVE :: first = .TRUE. -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writedynav_loc.f90
r5116 r5117 9 9 USE misc_mod 10 10 USE infotrac, ONLY: nqtot 11 usecom_io_dyn_mod, ONLY: histaveid, histvaveid, histuaveid11 USE com_io_dyn_mod, ONLY: histaveid, histvaveid, histuaveid 12 12 USE comconst_mod, ONLY: cpp 13 13 USE temps_mod, ONLY: itau_dyn … … 67 67 REAL, SAVE, ALLOCATABLE :: tm(:, :) 68 68 REAL, SAVE, ALLOCATABLE :: vnat(:, :), unat(:, :) 69 logical:: ok_sync69 LOGICAL :: ok_sync 70 70 INTEGER :: itau_w 71 71 INTEGER :: ijb, ije, jjn … … 76 76 ! Initialisations 77 77 ! 78 if(adjust) return78 IF (adjust) return 79 79 80 80 IF (first) THEN … … 121 121 ! 122 122 ije = ij_end 123 if(pole_sud) jjn = jj_nb - 1124 if(pole_sud) ije = ij_end - iip1123 IF (pole_sud) jjn = jj_nb - 1 124 IF (pole_sud) ije = ij_end - iip1 125 125 !$OMP BARRIER 126 126 !$OMP MASTER … … 209 209 ! 210 210 !$OMP MASTER 211 if(ok_sync) THEN211 IF (ok_sync) THEN 212 212 CALL histsync(histaveid) 213 213 CALL histsync(histvaveid) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writehist_loc.f90
r5116 r5117 6 6 USE misc_mod 7 7 USE infotrac, ONLY: nqtot 8 usecom_io_dyn_mod, ONLY: histid, histvid, histuid8 USE com_io_dyn_mod, ONLY: histid, histvid, histuid 9 9 USE comconst_mod, ONLY: cpp 10 10 USE temps_mod, ONLY: itau_dyn … … 64 64 REAL, SAVE, ALLOCATABLE :: tm(:, :) 65 65 REAL, SAVE, ALLOCATABLE :: vnat(:, :), unat(:, :) 66 logical:: ok_sync66 LOGICAL :: ok_sync 67 67 INTEGER :: itau_w 68 68 INTEGER :: ijb, ije, jjn … … 73 73 ! Initialisations 74 74 ! 75 if(adjust) return75 IF (adjust) return 76 76 77 77 IF (first) THEN … … 118 118 ! 119 119 ije = ij_end 120 if(pole_sud) jjn = jj_nb - 1121 if(pole_sud) ije = ij_end - iip1120 IF (pole_sud) jjn = jj_nb - 1 121 IF (pole_sud) ije = ij_end - iip1 122 122 !$OMP BARRIER 123 123 !$OMP MASTER … … 205 205 ! 206 206 !$OMP MASTER 207 if(ok_sync) THEN207 IF (ok_sync) THEN 208 208 CALL histsync(histid) 209 209 CALL histsync(histvid) 210 210 CALL histsync(histuid) 211 endif211 ENDIF 212 212 !$OMP END MASTER 213 213 END SUBROUTINE writehist_loc
Note: See TracChangeset
for help on using the changeset viewer.