Changeset 3852 for LMDZ6/branches/LMDZ-tracers/libf/dyn3d
- Timestamp:
- Feb 22, 2021, 5:28:31 PM (3 years ago)
- Location:
- LMDZ6/branches/LMDZ-tracers/libf/dyn3d
- Files:
-
- 9 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/advtrac.F90
r2622 r3852 9 9 ! M.A Filiberti (04/2002) 10 10 ! 11 USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif11 USE infotrac, ONLY: nqtot, tracers 12 12 USE control_mod, ONLY: iapp_tracvl, day_step 13 13 USE comconst_mod, ONLY: dtvr … … 48 48 INTEGER iadvtr 49 49 INTEGER ij,l,iq,iiq 50 INTEGER, POINTER :: iadv(:) 50 51 REAL zdpmin, zdpmax 51 52 EXTERNAL minmax … … 73 74 real, save :: cflxmax(llm),cflymax(llm),cflzmax(llm) 74 75 76 iadv => tracers(:)%iadv 77 75 78 IF(iadvtr.EQ.0) THEN 76 79 pbaruc(:,:)=0 … … 219 222 !----------------------------------------------------------- 220 223 221 if (ok_iso_verif) then 222 write(*,*) 'advtrac 227' 223 call check_isotopes_seq(q,ip1jmp1,'advtrac 162') 224 endif !if (ok_iso_verif) then 225 226 do iq=1,nqperes 224 call check_isotopes_seq(q,ip1jmp1,'advtrac 162') 225 226 do iq=1,nqtot 227 227 ! call clock(t_initial) 228 if(iadv(iq) == 0 ) cycle228 if(iadv(iq) == 0 .OR. tracers(iq)%igen /= 1) cycle 229 229 ! ---------------------------------------------------------------- 230 230 ! Schema de Van Leer I MUSCL … … 394 394 end DO 395 395 396 if (ok_iso_verif) then 397 write(*,*) 'advtrac 402' 398 call check_isotopes_seq(q,ip1jmp1,'advtrac 397') 399 endif !if (ok_iso_verif) then 396 call check_isotopes_seq(q,ip1jmp1,'advtrac 397') 400 397 401 398 !------------------------------------------------------------------ -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/check_isotopes.F90
r3850 r3852 1 subroutine check_isotopes_seq(q,ip1jmp1,err_msg) 2 USE infotrac 3 implicit none 1 SUBROUTINE check_isotopes_seq(q, ip1jmp1, err_msg) 2 USE strings_mod, ONLY: strIdx, msg, modname, prt_level 3 USE infotrac, ONLY: isotope, isoSelect, iH2O, isoCheck, isoName, nqtot, niso, nitr, nzon, npha, iTraPha, iZonIso, tnat 4 IMPLICIT NONE 5 include "dimensions.h" 6 REAL, INTENT(INOUT) :: q(ip1jmp1,llm,nqtot) 7 INTEGER, INTENT(IN) :: ip1jmp1 8 CHARACTER(LEN=*), INTENT(IN) :: err_msg !--- Error message to display 9 CHARACTER(LEN=256) :: msg1 10 INTEGER :: ixt, ipha, k, i, iq, iiso, izon, ieau, iqeau 11 INTEGER, ALLOCATABLE :: ix(:) 12 REAL :: xtractot, xiiso, deltaD, q1, q2 13 REAL, PARAMETER :: borne = 1e19, & 14 errmax = 1e-8, & !--- Max. absolute error 15 errmaxrel = 1e-8, & !--- Max. relative error 16 qmin = 1e-11, & 17 deltaDmax = 200.0, & 18 deltaDmin =-999.9, & 19 ridicule = 1e-12 20 INTEGER, SAVE :: ixH2O, ixHDO, ixO18 21 LOGICAL, SAVE :: first=.TRUE. 4 22 5 #include "dimensions.h" 23 modname = 'check_isotopes' 24 IF(first) THEN 25 IF(isoSelect('H2O')) RETURN 26 ixH2O = strIdx(isoName,'H2[16]O') 27 ixHDO = strIdx(isoName,'H[2]HO') 28 ixO18 = strIdx(isoName,'H2[18]O') 29 first = .FALSE. 30 ELSE 31 IF(isoSelect(iH2O)) RETURN 32 END IF 33 IF(.NOT.isoCheck .OR. niso == 0) RETURN !--- No need to check or no isotopes => finished 6 34 7 ! inputs 8 integer ip1jmp1 9 real q(ip1jmp1,llm,nqtot) 10 character*(*) err_msg ! message d''erreur à afficher 35 !--- CHECK FOR NaNs (FOR ALL THE ISOTOPES, INCLUDING GEOGRAPHIC TAGGING TRACERS) 36 DO ixt = 1, nitr 37 DO ipha = 1, npha 38 iq = iTraPha(ixt,ipha) 39 DO k = 1, llm 40 DO i = 1, ip1jmp1 41 IF(ABS(q(i,k,iq))<=borne) CYCLE 42 WRITE(msg1,'(s,"(",i0,",",i0,",",i0,") = ",ES12.4)')isoName(ixt),i,k,iq,q(i,k,iq); CALL msg(msg1) 43 CALL abort_gcm(modname, 'Error in iso_verif_noNaN: '//TRIM(err_msg), 1) 44 STOP 45 END DO 46 END DO 47 END DO 48 END DO 11 49 12 ! locals 13 integer ixt,phase,k,i,iq,iiso,izone,ieau,iqeau 14 real xtractot,xiiso 15 real borne 16 real qmin 17 real errmax ! erreur maximale en absolu. 18 real errmaxrel ! erreur maximale en relatif autorisée 19 real deltaDmax,deltaDmin 20 real ridicule 21 parameter (borne=1e19) 22 parameter (errmax=1e-8) 23 parameter (errmaxrel=1e-3) 24 parameter (qmin=1e-11) 25 parameter (deltaDmax=200.0,deltaDmin=-999.9) 26 parameter (ridicule=1e-12) 27 real deltaD 50 !--- CHECK CONSERVATION (MAIN ISOTOPE AND PARENT CONCENTRATIONS MUST BE EQUAL) 51 ixt = ixH2O 52 IF(ixt /= 0) THEN 53 DO ipha = 1, npha 54 iq = iTraPha(ixt,ipha) 55 DO k = 1, llm 56 DO i = 1, ip1jmp1 57 q1 = q(i,k,ipha); q2 = q(i,k,iq) 58 IF(ABS(q1-q2) <= errmax .OR. ABS(q1-q2)/MAX(MAX(ABS(q1),ABS(q2)),1e-18) < errmaxrel) CYCLE 59 WRITE(msg1,'("ixt = ",i0)')ixt; CALL msg(msg1) 60 WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q2; CALL msg(msg1) 61 WRITE(msg1,'("q(",i0,",",i0,",ipha=",i0,") = ",ES12.4)')i,k,ipha,q1; CALL msg(msg1) 62 CALL abort_gcm(modname, 'Error in iso_verif_egalite: '//TRIM(err_msg), 1) 63 q(i,k,iq) = q(i,k,ipha) !--- Bidouille pour convergence 64 END DO 65 END DO 66 END DO 67 END IF 28 68 29 if (ok_isotopes) then 69 !--- CHECK DELTA ANOMALIES 70 ix = [ixHDO, ixO18] 71 DO iiso = 1, SIZE(ix) 72 ixt = ix(iiso) 73 IF(ixt == 0) CYCLE 74 DO ipha = 1, npha 75 iq = iTraPha(ixt,ipha) 76 DO k = 1, llm 77 DO i = 1, ip1jmp1 78 q1 = q(i,k,ipha); q2 = q(i,k,iq) 79 IF(q2 <= qmin) CYCLE 80 deltaD = (q2/q1/tnat(ixt)-1)*1000 81 IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE 82 WRITE(msg1,'("ixt = ",i0)')ixt; CALL msg(msg1) 83 WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q2; CALL msg(msg1) 84 WRITE(msg1,'("q=",ES12.4)')q(i,k,:); CALL msg(msg1) 85 WRITE(msg1,'("deltaD=",ES12.4)')deltaD; CALL msg(msg1) 86 CALL abort_gcm(modname, 'Error in iso_verif_aberrant: '//TRIM(err_msg), 1) 87 END DO 88 END DO 89 END DO 90 END DO 30 91 31 write(*,*) 'check_isotopes 31: err_msg=',err_msg 32 ! verifier que rien n'est NaN 33 do ixt=1,ntraciso 34 do phase=1,nqo 35 iq=iqiso(ixt,phase) 36 do k=1,llm 37 DO i = 1,ip1jmp1 38 if ((q(i,k,iq).gt.-borne).and. 39 : (q(i,k,iq).lt.borne)) then 40 else !if ((x(ixt,i,j).gt.-borne).and. 41 write(*,*) 'erreur detectee par iso_verif_noNaN:' 42 write(*,*) err_msg 43 write(*,*) 'q,i,k,iq=',q(i,k,iq),i,k,iq 44 write(*,*) 'borne=',borne 45 stop 46 endif !if ((x(ixt,i,j).gt.-borne).and. 47 enddo !DO i = 1,ip1jmp1 48 enddo !do k=1,llm 49 enddo !do phase=1,nqo 50 enddo !do ixt=1,ntraciso 92 !--- CHECK FOR TAGGING TRACERS DELTAD ANOMALIES 93 IF(nitr == 0) RETURN 94 IF(ixH2O /= 0 .AND. ixHDO /= 0) THEN 95 DO izon = 1, nzon 96 ixt = iZonIso(izon, ixHDO) 97 ieau = iZonIso(izon, ixH2O) 98 DO ipha = 1, npha 99 iq = iTraPha(ixt, ipha) 100 iqeau = iTraPha(ieau, ipha) 101 DO k = 1, llm 102 DO i = 1, ip1jmp1 103 IF(q(i,k,iq)<=qmin) CYCLE 104 deltaD = (q(i,k,iq)/q(i,k,iqeau)/tnat(ixHDO)-1)*1000 105 IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE 106 WRITE(msg1,'("izon, ipha =",2i0)')izon, ipha; CALL msg(msg1) 107 WRITE(msg1,'( "ixt, ieau =",2i0)') ixt, ieau; CALL msg(msg1) 108 WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q(i,k,iq); CALL msg(msg1) 109 WRITE(msg1,'("deltaD=",ES12.4)')deltaD; CALL msg(msg1) 110 CALL abort_gcm(modname, 'Error in iso_verif_aberrant trac: '//TRIM(err_msg), 1) 111 END DO 112 END DO 113 END DO 114 END DO 115 END IF 51 116 52 !write(*,*) 'check_isotopes 52' 53 ! verifier que l'eau normale est OK 54 if (use_iso(1)) then 55 ixt=indnum_fn_num(1) 56 do phase=1,nqo 57 iq=iqiso(ixt,phase) 58 do k=1,llm 59 DO i = 1,ip1jmp1 60 if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and. 61 : (abs((q(i,k,phase)-q(i,k,iq))/ 62 : max(max(abs(q(i,k,phase)),abs(q(i,k,iq))),1e-18)) 63 : .gt.errmaxrel)) then 64 write(*,*) 'erreur detectee par iso_verif_egalite:' 65 write(*,*) err_msg 66 write(*,*) 'ixt,phase=',ixt,phase 67 write(*,*) 'q,iq,i,k=',q(i,k,iq),iq,i,k 68 write(*,*) 'q(i,k,phase)=',q(i,k,phase) 69 stop 70 endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and. 71 ! bidouille pour éviter divergence: 72 q(i,k,iq)= q(i,k,phase) 73 enddo ! DO i = 1,ip1jmp1 74 enddo !do k=1,llm 75 enddo ! do phase=1,nqo 76 endif !if (use_iso(1)) then 77 78 !write(*,*) 'check_isotopes 78' 79 ! verifier que HDO est raisonable 80 if (use_iso(2)) then 81 ixt=indnum_fn_num(2) 82 do phase=1,nqo 83 iq=iqiso(ixt,phase) 84 do k=1,llm 85 DO i = 1,ip1jmp1 86 if (q(i,k,iq).gt.qmin) then 87 deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(2)-1)*1000 88 if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then 89 write(*,*) 'erreur detectee par iso_verif_aberrant:' 90 write(*,*) err_msg 91 write(*,*) 'ixt,phase=',ixt,phase 92 write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k 93 write(*,*) 'q=',q(i,k,:) 94 write(*,*) 'deltaD=',deltaD 95 stop 96 endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then 97 endif !if (q(i,k,iq).gt.qmin) then 98 enddo !DO i = 1,ip1jmp1 99 enddo !do k=1,llm 100 enddo ! do phase=1,nqo 101 endif !if (use_iso(2)) then 117 !--- CHECK FOR TAGGING TRACERS CONSERVATION (PARENT AND TAGGING TRACERS SUM OVER ALL REGIONS MUST BE EQUAL) 118 DO iiso = 1, niso 119 DO ipha = 1, npha 120 iq = iTraPha(iiso, ipha) 121 DO k = 1, llm 122 DO i = 1, ip1jmp1 123 xiiso = q(i,k,iq) 124 xtractot = SUM(q(i, k, iTraPha(iZonIso(1:nzon,iiso), ipha))) 125 IF(ABS(xtractot-xiiso) > errmax .AND. ABS(xtractot-xiiso)/MAX(MAX(ABS(xtractot),ABS(xiiso)),1e-18) > errmaxrel) THEN 126 CALL msg('Error in iso_verif_aberrant trac: '//TRIM(err_msg)) 127 WRITE(msg1,'("iiso, ipha =",2i0)')iiso, ipha; CALL msg(msg1) 128 WRITE(msg1,'("i, k =",2i0)')i, k; CALL msg(msg1) 129 WRITE(msg1,'("q(",i0,",",i0,":) = ",ES12.4)')i,k,q(i,k,:); CALL msg(msg1) 130 STOP 131 END IF 132 IF(ABS(xtractot) <= ridicule) CYCLE 133 DO izon = 1, nzon 134 ixt = iZonIso(izon, iiso) 135 q(i,k,iq) = q(i,k,iq) / xtractot * xiiso 136 END DO 137 END DO 138 END DO 139 END DO 140 END DO 102 141 103 !write(*,*) 'check_isotopes 103' 104 ! verifier que O18 est raisonable 105 if (use_iso(3)) then 106 ixt=indnum_fn_num(3) 107 do phase=1,nqo 108 iq=iqiso(ixt,phase) 109 do k=1,llm 110 DO i = 1,ip1jmp1 111 if (q(i,k,iq).gt.qmin) then 112 deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(3)-1)*1000 113 if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then 114 write(*,*) 'erreur detectee iso_verif_aberrant O18:' 115 write(*,*) err_msg 116 write(*,*) 'ixt,phase=',ixt,phase 117 write(*,*) 'q,iq,i,k,=',q(i,k,phase),iq,i,k 118 write(*,*) 'xt=',q(i,k,:) 119 write(*,*) 'deltaO18=',deltaD 120 stop 121 endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then 122 endif !if (q(i,k,iq).gt.qmin) then 123 enddo !DO i = 1,ip1jmp1 124 enddo !do k=1,llm 125 enddo ! do phase=1,nqo 126 endif !if (use_iso(2)) then 142 END SUBROUTINE check_isotopes_seq 127 143 128 129 !write(*,*) 'check_isotopes 129'130 if (ok_isotrac) then131 132 if (use_iso(2).and.use_iso(1)) then133 do izone=1,ntraceurs_zone134 ixt=index_trac(izone,indnum_fn_num(2))135 ieau=index_trac(izone,indnum_fn_num(1))136 do phase=1,nqo137 iq=iqiso(ixt,phase)138 iqeau=iqiso(ieau,phase)139 do k=1,llm140 DO i = 1,ip1jmp1141 if (q(i,k,iq).gt.qmin) then142 deltaD=(q(i,k,iq)/q(i,k,iqeau)/tnat(2)-1)*1000143 if ((deltaD.gt.deltaDmax).or.144 & (deltaD.lt.deltaDmin)) then145 write(*,*) 'erreur dans iso_verif_aberrant trac:'146 write(*,*) err_msg147 write(*,*) 'izone,phase=',izone,phase148 write(*,*) 'ixt,ieau=',ixt,ieau149 write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k150 write(*,*) 'deltaD=',deltaD151 stop152 endif !if ((deltaD.gt.deltaDmax).or.153 endif !if (q(i,k,iq).gt.qmin) then154 enddo !DO i = 1,ip1jmp1155 enddo ! do k=1,llm156 enddo ! do phase=1,nqo157 enddo !do izone=1,ntraceurs_zone158 endif !if (use_iso(2).and.use_iso(1)) then159 160 do iiso=1,niso161 do phase=1,nqo162 iq=iqiso(iiso,phase)163 do k=1,llm164 DO i = 1,ip1jmp1165 xtractot=0.0166 xiiso=q(i,k,iq)167 do izone=1,ntraceurs_zone168 iq=iqiso(index_trac(izone,iiso),phase)169 xtractot=xtractot+ q(i,k,iq)170 enddo !do izone=1,ntraceurs_zone171 if ((abs(xtractot-xiiso).gt.errmax).and.172 : (abs(xtractot-xiiso)/173 : max(max(abs(xtractot),abs(xiiso)),1e-18)174 : .gt.errmaxrel)) then175 write(*,*) 'erreur detectee par iso_verif_traceurs:'176 write(*,*) err_msg177 write(*,*) 'iiso,phase=',iiso,phase178 write(*,*) 'i,k,=',i,k179 write(*,*) 'q(i,k,:)=',q(i,k,:)180 stop181 endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.182 183 ! bidouille pour éviter divergence:184 if (abs(xtractot).gt.ridicule) then185 do izone=1,ntraceurs_zone186 ixt=index_trac(izone,iiso)187 q(i,k,iq)=q(i,k,iq)/xtractot*xiiso188 enddo !do izone=1,ntraceurs_zone189 endif !if ((abs(xtractot).gt.ridicule) then190 enddo !DO i = 1,ip1jmp1191 enddo !do k=1,llm192 enddo !do phase=1,nqo193 enddo !do iiso=1,niso194 195 endif !if (ok_isotrac) then196 197 endif ! if (ok_isotopes)198 !write(*,*) 'check_isotopes 198'199 200 end201 -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/dynetat0.f90
r2859 r3852 6 6 ! Purpose: Initial state reading. 7 7 !------------------------------------------------------------------------------- 8 USE infotrac 8 USE infotrac, ONLY: nqtot, niso, tracers, iTraPha, tnat, alpha_ideal, tra 9 9 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_INQ_VARID, NF90_NoErr, & 10 10 NF90_CLOSE, NF90_GET_VAR 11 USE strings_mod, ONLY: strIdx 11 12 USE control_mod, ONLY: planet_type 12 13 USE assert_eq_m, ONLY: assert_eq … … 36 37 !=============================================================================== 37 38 ! Local variables: 38 CHARACTER(LEN=256) :: msg, var, modname39 CHARACTER(LEN=256) :: sdum, var, modname, oldH2O(3), newH2O(3) 39 40 INTEGER, PARAMETER :: length=100 40 INTEGER :: iq, fID, vID, idecal !, iml, jml, lml, nqt41 INTEGER :: iq, fID, vID, idecal, ix!, iml, jml, lml, nqt 41 42 REAL :: time, tab_cntrl(length) !--- RUN PARAMS TABLE 43 TYPE(tra), POINTER :: tr 42 44 !------------------------------------------------------------------------------- 43 45 modname="dynetat0" 46 oldH2O=['H2Ov ','H2Ol ','H2Oi '] 47 newH2O=['H2O-g','H2O-l','H2O-s'] 44 48 45 49 !--- Initial state file opening … … 126 130 !--- Tracers 127 131 DO iq=1,nqtot 128 var=tname(iq) 132 tr => tracers(iq) 133 var = tr%name 129 134 IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN 130 135 CALL err(NF90_GET_VAR(fID,vID,q(:,:,:,iq)),"get",var); CYCLE 136 #ifdef INCA 137 ELSE IF(var == "O3") THEN !--- INCA and O3 missing: take OX instead 138 WRITE(lunout,*) 'Tracer O3 is missing - it is initialized to OX' 139 IF(NF90_INQ_VARID(fID,"OX",vID) == NF90_NoErr) THEN 140 CALL err(NF90_GET_VAR(fID,vID,q(:,:,:,iq)),"get",var); CYCLE 141 END IF 142 #endif 143 ELSE !--- Old file, water: H2Ov/l/i instead of H2O-g/-l/-s 144 ix = strIdx(newH2O, var) !--- Current tracer is water (new name) ? 145 IF(ix /= 0) THEN !--- Then read the field, using the old name. 146 IF(NF90_INQ_VARID(fID,oldH2O(ix),vID) == NF90_NoErr) THEN 147 CALL err(NF90_GET_VAR(fID,vID,q(:,:,:,iq)),"get",var); CYCLE 148 END IF 149 END IF 131 150 END IF 132 151 WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing" 133 152 WRITE(lunout,*)" It is hence initialized to zero" 134 153 q(:,:,:,iq)=0. 135 !--- CRisi: for isotops, theoretical initialization using very simplified136 ! Rayleigh distillation las.137 IF( ok_isotopes.AND.iso_num(iq)>0) THEN138 IF( zone_num(iq)==0) q(:,:,:,iq)=q(:,:,:,iqpere(iq))*tnat(iso_num(iq))&139 & *(q(:,:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1)140 IF( zone_num(iq)==1) q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq),phase_num(iq)))154 !--- CRisi: for isotops, theoretical initialization using very simplified 155 ! Rayleigh distillation las. 156 IF(niso > 0 .AND. tr%iso_num > 0) THEN 157 IF(tr%iso_zon == 0) q(:,:,:,iq) = q(:,:,:,tr%iprnt) * tnat(tr%iso_num) & 158 *(q(:,:,:,tr%iprnt)/30.e-3)**(alpha_ideal(tr%iso_num)-1) 159 IF(tr%iso_zon == 1) q(:,:,:,iq) = q(:,:,:,iTraPha(tr%iso_num,tr%iso_pha)) 141 160 END IF 142 161 END DO … … 153 172 INTEGER, INTENT(IN) :: n1, n2 154 173 CHARACTER(LEN=*), INTENT(IN) :: str1, str2 155 CHARACTER(LEN= 100) :: s1, s2174 CHARACTER(LEN=256) :: s1, s2 156 175 IF(n1/=n2) THEN 157 176 s1='value of '//TRIM(str1)//' =' 158 177 s2=' read in starting file differs from parametrized '//TRIM(str2)//' =' 159 WRITE( msg,'(10x,a,i4,2x,a,i4)'),TRIM(ADJUSTL(s1)),n1,TRIM(ADJUSTL(s2)),n2160 CALL ABORT_gcm(TRIM(modname),TRIM( msg),1)178 WRITE(sdum,'(10x,a,i4,2x,a,i4)'),TRIM(ADJUSTL(s1)),n1,TRIM(ADJUSTL(s2)),n2 179 CALL ABORT_gcm(TRIM(modname),TRIM(sdum),1) 161 180 END IF 162 181 END SUBROUTINE check_dim … … 193 212 IF(ierr==NF90_NoERR) RETURN 194 213 SELECT CASE(typ) 195 CASE('inq'); msg="Field <"//TRIM(nam)//"> is missing"196 CASE('get'); msg="Reading failed for <"//TRIM(nam)//">"197 CASE('open'); msg="File opening failed for <"//TRIM(nam)//">"198 CASE('close'); msg="File closing failed for <"//TRIM(nam)//">"214 CASE('inq'); sdum="Field <"//TRIM(nam)//"> is missing" 215 CASE('get'); sdum="Reading failed for <"//TRIM(nam)//">" 216 CASE('open'); sdum="File opening failed for <"//TRIM(nam)//">" 217 CASE('close'); sdum="File closing failed for <"//TRIM(nam)//">" 199 218 END SELECT 200 CALL ABORT_gcm(TRIM(modname),TRIM( msg),ierr)219 CALL ABORT_gcm(TRIM(modname),TRIM(sdum),ierr) 201 220 END SUBROUTINE err 202 221 -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/dynredem.F90
r3851 r3852 7 7 USE IOIPSL 8 8 #endif 9 USE infotrac 9 USE infotrac, ONLY: nqtot, tracers 10 10 USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL, & 11 11 NF90_CLOSE, NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER, & … … 145 145 CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID]) 146 146 DO iq=1,nqtot 147 CALL cre_var(nid,t name(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])147 CALL cre_var(nid,tracers(iq)%name,tracers(iq)%lnam,[rlonvID,rlatuID,sID,timID]) 148 148 END DO 149 149 CALL cre_var(nid,"masse","Masse d air" ,[rlonvID,rlatuID,sID,timID]) … … 166 166 ! Purpose: Write the NetCDF restart file (append). 167 167 !------------------------------------------------------------------------------- 168 USE infotrac 168 USE infotrac, ONLY: nqtot, tracers, type_trac 169 169 USE control_mod 170 170 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID, & … … 226 226 227 227 !--- Tracers in file "start_trac.nc" (added by Anne) 228 lread_inca=.FALSE.; fil="start_trac.nc" 229 IF(type_trac=='inca') INQUIRE(FILE=fil,EXIST=lread_inca) 228 fil="start_trac.nc" 229 INQUIRE(FILE=fil, EXIST=lread_inca) 230 lread_inca = lread_inca .AND. type_trac == 'inca' 230 231 IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open") 231 232 232 233 !--- Save tracers 233 DO iq=1,nqtot; var=t name(iq); ierr=-1234 DO iq=1,nqtot; var=tracers(iq)%name; ierr=-1 234 235 IF(lread_inca) THEN !--- Possibly read from "start_trac.nc" 235 236 fil="start_trac.nc" … … 237 238 dum='inq'; IF(ierr==NF90_NoErr) dum='fnd' 238 239 WRITE(lunout,*)msg(dum,var) 239 240 241 240 IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,:,iq),llm) 242 241 END IF -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/iniacademic.F90
r2622 r3852 5 5 6 6 USE filtreg_mod, ONLY: inifilr 7 USE infotrac 7 USE infotrac, ONLY: nqtot, niso, tracers, iTraPha, tnat, alpha_ideal, tra 8 8 USE control_mod, ONLY: day_step,planet_type 9 9 #ifdef CPP_IOIPSL … … 73 73 74 74 REAL zdtvr 75 75 76 TYPE(tra), POINTER :: tr 77 76 78 character(len=*),parameter :: modname="iniacademic" 77 79 character(len=80) :: abort_message … … 96 98 time_0=0. 97 99 day_ref=1 98 annee_ref=0100 ! annee_ref=0 99 101 100 102 im = iim … … 265 267 ! CRisi: init des isotopes 266 268 ! distill de Rayleigh très simplifiée 267 if (ok_isotopes) then 268 if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then 269 q(:,:,i)=q(:,:,iqpere(i)) & 270 & *tnat(iso_num(i)) & 271 & *(q(:,:,iqpere(i))/30.e-3) & 272 & **(alpha_ideal(iso_num(i))-1) 273 endif 274 if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then 275 q(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i))) 276 endif 277 endif !if (ok_isotopes) then 269 tr => tracers(i) 270 if (niso > 0 .AND. tr%iso_num > 0) then 271 if(tr%iso_zon == 0) q(:,:,i) = & 272 & q(:,:,tr%iprnt)*tnat(tr%iso_num) & 273 & *(q(:,:,tr%iprnt)/30.e-3) & 274 & **(alpha_ideal(tr%iso_num)-1) 275 if (tr%iso_zon == 1) q(:,:,i) = & 276 q(:,:,iTraPha(tr%iso_num,tr%iso_pha)) 277 endif !if (niso > 0 .AND. tr%iso_num > 0) 278 278 279 279 enddo … … 282 282 endif ! of if (planet_type=="earth") 283 283 284 if (ok_iso_verif) then 285 call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc') 286 endif !if (ok_iso_verif) then 284 call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc') 287 285 288 286 ! add random perturbation to temperature -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/integrd.F
r2603 r3852 212 212 ENDDO 213 213 214 CALL check_isotopes_seq(q,ip1jmp1,'integrd 342') 215 214 216 CALL qminimum( q, nq, deltap ) 217 218 CALL check_isotopes_seq(q,ip1jmp1,'integrd 346') 215 219 216 220 c … … 235 239 ENDDO 236 240 ENDDO 241 CALL check_isotopes_seq(q,ip1jmp1,'integrd 409') 237 242 238 243 ! Ehouarn: forget about finvmaold -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/leapfrog.F
r3416 r3852 11 11 use IOIPSL 12 12 #endif 13 USE infotrac, ONLY: nqtot ,ok_iso_verif13 USE infotrac, ONLY: nqtot 14 14 USE guide_mod, ONLY : guide_main 15 15 USE write_field, ONLY: writefield … … 237 237 jH_cur = jH_cur - int(jH_cur) 238 238 239 if (ok_iso_verif) then 240 call check_isotopes_seq(q,ip1jmp1,'leapfrog 321') 241 endif !if (ok_iso_verif) then 239 call check_isotopes_seq(q,ip1jmp1,'leapfrog 321') 242 240 243 241 #ifdef CPP_IOIPSL … … 271 269 ! CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 ) 272 270 273 if (ok_iso_verif) then 274 call check_isotopes_seq(q,ip1jmp1,'leapfrog 400') 275 endif !if (ok_iso_verif) then 271 call check_isotopes_seq(q,ip1jmp1,'leapfrog 400') 276 272 277 273 2 CONTINUE ! Matsuno backward or leapfrog step begins here … … 323 319 endif 324 320 325 326 if (ok_iso_verif) then 327 call check_isotopes_seq(q,ip1jmp1,'leapfrog 589') 328 endif !if (ok_iso_verif) then 321 call check_isotopes_seq(q,ip1jmp1,'leapfrog 589') 329 322 330 323 c----------------------------------------------------------------------- … … 345 338 c ------------------------------------------------------------- 346 339 347 if (ok_iso_verif) then 348 call check_isotopes_seq(q,ip1jmp1, 340 call check_isotopes_seq(q,ip1jmp1, 349 341 & 'leapfrog 686: avant caladvtrac') 350 endif !if (ok_iso_verif) then351 342 352 343 IF( forward. OR . leapf ) THEN … … 376 367 c ---------------------------------- 377 368 378 if (ok_iso_verif) then 379 write(*,*) 'leapfrog 720' 380 call check_isotopes_seq(q,ip1jmp1,'leapfrog 756') 381 endif !if (ok_iso_verif) then 369 call check_isotopes_seq(q,ip1jmp1,'leapfrog 756') 382 370 383 371 CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 , … … 385 373 ! $ finvmaold ) 386 374 387 if (ok_iso_verif) then 388 write(*,*) 'leapfrog 724' 389 call check_isotopes_seq(q,ip1jmp1,'leapfrog 762') 390 endif !if (ok_iso_verif) then 375 call check_isotopes_seq(q,ip1jmp1,'leapfrog 762') 391 376 392 377 c .P.Le Van (26/04/94 ajout de finvpold dans l'appel d'integrd) … … 552 537 CALL massdair(p,masse) 553 538 554 if (ok_iso_verif) then 555 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196') 556 endif !if (ok_iso_verif) then 539 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196') 557 540 558 541 c----------------------------------------------------------------------- … … 639 622 c preparation du pas d'integration suivant ...... 640 623 641 if (ok_iso_verif) then 642 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509') 643 endif !if (ok_iso_verif) then 624 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509') 644 625 645 626 IF ( .NOT.purmats ) THEN … … 703 684 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 704 685 705 if (ok_iso_verif) then 706 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584') 707 endif !if (ok_iso_verif) then 686 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584') 708 687 709 688 c----------------------------------------------------------------------- … … 785 764 ELSE ! of IF (.not.purmats) 786 765 787 if (ok_iso_verif) then 788 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664') 789 endif !if (ok_iso_verif) then 766 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664') 790 767 791 768 c ........................................................ … … 812 789 ELSE ! of IF(forward) i.e. backward step 813 790 814 if (ok_iso_verif) then 815 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698') 816 endif !if (ok_iso_verif) then 791 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698') 817 792 818 793 IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/qminimum.F
r2600 r3852 4 4 SUBROUTINE qminimum( q,nqtot,deltap ) 5 5 6 USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif6 USE infotrac, ONLY: niso, nitr, iTraPha 7 7 IMPLICIT none 8 8 c … … 49 49 c 50 50 51 if (ok_iso_verif) then 52 call check_isotopes_seq(q,ip1jmp1,'qminimum 52') 53 endif !if (ok_iso_verif) then 51 call check_isotopes_seq(q,ip1jmp1,'qminimum 52') 54 52 55 53 zx_defau_diag(:,:,:)=0.0 … … 59 57 if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then 60 58 61 if (ok_isotopes) then 62 zx_defau_diag(i,k,iq_liq)=AMAX1 59 if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1 63 60 : ( seuil_liq - q(i,k,iq_liq), 0.0 ) 64 endif !if (ok_isotopes) then65 61 66 62 q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq … … 80 76 if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then 81 77 82 if (ok_isotopes) then 83 zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 ) 84 endif !if (ok_isotopes) then 78 zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 ) 85 79 86 80 q(i,k-1,iq) = q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) * … … 110 104 111 105 !write(*,*) 'qminimum 128' 112 if ( ok_isotopes) then106 if (niso > 0) then 113 107 ! CRisi: traiter de même les traceurs d'eau 114 108 ! Mais il faut les prendre à l'envers pour essayer de conserver la … … 130 124 if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 131 125 ! on ajoute la vapeur en k 132 do ixt=1,n traciso133 q(i,k,i qiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))126 do ixt=1,nitr 127 q(i,k,iTraPha(ixt,iq_vap))=q(i,k,iTraPha(ixt,iq_vap)) 134 128 : +zx_defau_diag(i,k,iq_vap) 135 : *q(i,k-1,i qiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)129 : *q(i,k-1,iTraPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 136 130 137 131 ! et on la retranche en k-1 138 q(i,k-1,i qiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))132 q(i,k-1,iTraPha(ixt,iq_vap))=q(i,k-1,iTraPha(ixt,iq_vap)) 139 133 : -zx_defau_diag(i,k,iq_vap) 140 134 : *deltap(i,k)/deltap(i,k-1) 141 : *q(i,k-1,i qiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)135 : *q(i,k-1,iTraPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 142 136 143 enddo !do ixt=1,ni so137 enddo !do ixt=1,nitr 144 138 q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap) 145 139 : +zx_defau_diag(i,k,iq_vap) … … 151 145 enddo !do k=2,llm 152 146 153 if (ok_iso_verif) then 154 call check_isotopes_seq(q,ip1jmp1,'qminimum 168') 155 endif !if (ok_iso_verif) then 147 call check_isotopes_seq(q,ip1jmp1,'qminimum 168') 156 148 157 149 … … 163 155 164 156 ! on ajoute eau liquide en k en k 165 do ixt=1,n traciso166 q(i,k,i qiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))157 do ixt=1,nitr 158 q(i,k,iTraPha(ixt,iq_liq))=q(i,k,iTraPha(ixt,iq_liq)) 167 159 : +zx_defau_diag(i,k,iq_liq) 168 : *q(i,k,i qiso(ixt,iq_vap))/q_follow(i,k,iq_vap)160 : *q(i,k,iTraPha(ixt,iq_vap))/q_follow(i,k,iq_vap) 169 161 ! et on la retranche à la vapeur en k 170 q(i,k,i qiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))162 q(i,k,iTraPha(ixt,iq_vap))=q(i,k,iTraPha(ixt,iq_vap)) 171 163 : -zx_defau_diag(i,k,iq_liq) 172 : *q(i,k,i qiso(ixt,iq_vap))/q_follow(i,k,iq_vap)164 : *q(i,k,iTraPha(ixt,iq_vap))/q_follow(i,k,iq_vap) 173 165 enddo !do ixt=1,niso 174 166 q_follow(i,k,iq_liq)= q_follow(i,k,iq_liq) … … 180 172 enddo !do k=2,llm 181 173 182 if (ok_iso_verif) then 183 call check_isotopes_seq(q,ip1jmp1,'qminimum 197') 184 endif !if (ok_iso_verif) then 174 call check_isotopes_seq(q,ip1jmp1,'qminimum 197') 185 175 186 endif !if ( ok_isotopes) then176 endif !if (niso > 0) then 187 177 !write(*,*) 'qminimum 188' 188 178 -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/vlsplt.F
r2603 r3852 4 4 5 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 6 USE infotrac, ONLY: nqtot, nqdesc,iqfils6 USE infotrac, ONLY: nqtot, tracers, tra 7 7 c 8 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 54 54 SAVE temps1,temps2,temps3 55 55 INTEGER iminn,imaxx 56 INTEGER ifils,iq2 ! CRisi 56 INTEGER ichld,iq2 ! CRisi 57 TYPE(tra), POINTER :: tr 57 58 58 59 REAL qmin,qmax … … 61 62 DATA temps1,temps2,temps3/0.,0.,0./ 62 63 64 tr => tracers(iq) 63 65 64 66 zzpbar = 0.5 * pdt … … 83 85 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 84 86 85 if ( nqdesc(iq).gt.0) then86 do i fils=1,nqdesc(iq)87 iq2= iqfils(ifils,iq)87 if (tr%ndesc > 0) then 88 do ichld=1,tr%ndesc 89 iq2=tr%idesc(ichld) 88 90 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 89 91 enddo 90 endif !if ( nqfils(iq).gt.0) then92 endif !if (tr%ndesc > 0) then 91 93 92 94 cprint*,'Entree vlx1' … … 122 124 ENDDO 123 125 ! CRisi: aussi pour les fils 124 if (nqdesc(iq).gt.0) then125 do i fils=1,nqdesc(iq)126 iq2= iqfils(ifils,iq)126 if(tr%ndesc > 0) then 127 do ichld=1,tr%ndesc 128 iq2=tr%idesc(ichld) 127 129 DO l=1,llm 128 130 DO ij=1,ip1jmp1 … … 133 135 ENDDO 134 136 ENDDO 135 enddo !do i fils=1,nqdesc(iq)136 endif ! if ( nqdesc(iq).gt.0) then137 enddo !do ichld=1,tr%ndesc 138 endif ! if (tr%ndesc > 0) 137 139 138 140 RETURN 139 141 END 140 142 RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq) 141 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils! CRisi143 USE infotrac, ONLY : nqtot, tracers, tra ! CRisi 142 144 143 145 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 179 181 ! CRisi 180 182 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 181 INTEGER ifils,iq2 ! CRisi 183 INTEGER ichld,iq2 ! CRisi 184 TYPE(tra), POINTER :: tr 182 185 183 186 Logical extremum,first,testcpu … … 200 203 first=.false. 201 204 ENDIF 205 206 tr => tracers(iq) 202 207 203 208 c calcul de la pente a droite et a gauche de la maille … … 450 455 !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq) 451 456 452 if ( nqdesc(iq).gt.0) then453 do i fils=1,nqdesc(iq)454 iq2= iqfils(ifils,iq)457 if (tr%ndesc > 0) then 458 do ichld=1,tr%ndesc 459 iq2=tr%idesc(ichld) 455 460 DO l=1,llm 456 461 DO ij=iip2,ip1jm … … 460 465 enddo 461 466 enddo 462 enddo !do i fils=1,nqdesc(iq)463 do i fils=1,nqfils(iq)464 iq2= iqfils(ifils,iq)467 enddo !do ichld=1,tr%ndesc 468 do ichld=1,tr%nchld 469 iq2=tr%idesc(ichld) 465 470 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 466 enddo !do i fils=1,nqfils(iq)467 endif !if ( nqfils(iq).gt.0) then471 enddo !do ichld=1,tr%nchld 472 endif !if (tr%nchld > 0) then 468 473 ! end CRisi 469 474 … … 489 494 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 490 495 ! puis on boucle en longitude 491 if ( nqdesc(iq).gt.0) then492 do i fils=1,nqdesc(iq)493 iq2= iqfils(ifils,iq)496 if (tr%ndesc > 0) then 497 do ichld=1,tr%ndesc 498 iq2=tr%idesc(ichld) 494 499 DO l=1,llm 495 500 DO ij=iip2+1,ip1jm … … 500 505 enddo ! DO ij=ijb+iip1-1,ije,iip1 501 506 enddo !DO l=1,llm 502 enddo !do i fils=1,nqdesc(iq)503 endif !if ( nqfils(iq).gt.0) then507 enddo !do ichld=1,tr%ndesc 508 endif !if (tr%ndesc > 0) then 504 509 505 510 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 510 515 END 511 516 RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq) 512 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils! CRisi517 USE infotrac, ONLY : nqtot, tracers, tra ! CRisi 513 518 c 514 519 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 562 567 563 568 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 564 INTEGER i fils,iq2 ! CRisi565 569 INTEGER ichld,iq2 ! CRisi 570 TYPE(tra), POINTER :: tr 566 571 c 567 572 c … … 590 595 ENDIF 591 596 597 tr => tracers(iq) 592 598 c 593 599 cPRINT*,'CALCUL EN LATITUDE' … … 770 776 !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 771 777 772 if ( nqfils(iq).gt.0) then773 do i fils=1,nqdesc(iq)774 iq2= iqfils(ifils,iq)778 if (tr%ndesc > 0) then 779 do ichld=1,tr%ndesc 780 iq2=tr%idesc(ichld) 775 781 DO l=1,llm 776 782 DO ij=1,ip1jmp1 … … 781 787 enddo 782 788 enddo 783 enddo !do i fils=1,nqdesc(iq)784 785 do i fils=1,nqfils(iq)786 iq2= iqfils(ifils,iq)789 enddo !do ichld=1,tr%ndesc 790 791 do ichld=1,tr%nchld 792 iq2=tr%idesc(ichld) 787 793 call vly(Ratio,pente_max,masseq,qbyv,iq2) 788 enddo !do i fils=1,nqfils(iq)789 endif !if ( nqfils(iq).gt.0) then794 enddo !do ichld=1,tr%nchld 795 endif !if (tr%ndesc > 0) 790 796 791 797 DO l=1,llm … … 855 861 856 862 ! retablir les fils en rapport de melange par rapport a l'air: 857 if ( nqfils(iq).gt.0) then858 do i fils=1,nqdesc(iq)859 iq2= iqfils(ifils,iq)863 if (tr%ndesc > 0) then 864 do ichld=1,tr%ndesc 865 iq2=tr%idesc(ichld) 860 866 DO l=1,llm 861 867 DO ij=1,ip1jmp1 … … 863 869 enddo 864 870 enddo 865 enddo !do i fils=1,nqdesc(iq)866 endif !if ( nqfils(iq).gt.0) then871 enddo !do ichld=1,tr%ndesc 872 endif !if (tr%ndesc > 0) 867 873 868 874 !write(*,*) 'vly 853: sortie' … … 871 877 END 872 878 RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq) 873 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils! CRisi879 USE infotrac, ONLY : nqtot, tracers, tra ! CRisi 874 880 c 875 881 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 907 913 908 914 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 909 INTEGER ifils,iq2 ! CRisi 915 INTEGER ichld,iq2 ! CRisi 916 TYPE(tra), POINTER :: tr 910 917 911 918 LOGICAL testcpu … … 923 930 924 931 !write(*,*) 'vlz 923: entree' 932 933 tr => tracers(iq) 925 934 926 935 #ifdef BIDON … … 992 1001 ! Il faut faire ça avant d'avoir mis à jour q et masse 993 1002 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 994 if ( nqfils(iq).gt.0) then995 do i fils=1,nqdesc(iq)996 iq2= iqfils(ifils,iq)1003 if (tr%ndesc > 0) then 1004 do ichld=1,tr%ndesc 1005 iq2=tr%idesc(ichld) 997 1006 DO l=1,llm 998 1007 DO ij=1,ip1jmp1 … … 1001 1010 enddo 1002 1011 enddo 1003 enddo !do i fils=1,nqdesc(iq)1012 enddo !do ichld=1,tr%ndesc 1004 1013 1005 do i fils=1,nqfils(iq)1006 iq2= iqfils(ifils,iq)1014 do ichld=1,tr%nchld 1015 iq2=tr%idesc(ichld) 1007 1016 call vlz(Ratio,pente_max,masseq,wq,iq2) 1008 enddo !do i fils=1,nqfils(iq)1009 endif !if ( nqfils(iq).gt.0) then1017 enddo !do ichld=1,tr%nchld 1018 endif !if (tr%ndesc > 0) 1010 1019 ! end CRisi 1011 1020 … … 1020 1029 1021 1030 ! retablir les fils en rapport de melange par rapport a l'air: 1022 if ( nqfils(iq).gt.0) then1023 do i fils=1,nqdesc(iq)1024 iq2= iqfils(ifils,iq)1031 if (tr%ndesc > 0) then 1032 do ichld=1,tr%ndesc 1033 iq2=tr%idesc(ichld) 1025 1034 DO l=1,llm 1026 1035 DO ij=1,ip1jmp1 … … 1028 1037 enddo 1029 1038 enddo 1030 enddo !do i fils=1,nqdesc(iq)1031 endif !if ( nqfils(iq).gt.0) then1039 enddo !do ichld=1,tr%ndesc 1040 endif !if (tr%ndesc > 0) 1032 1041 !write(*,*) 'vlsplt 1032' 1033 1042 -
LMDZ6/branches/LMDZ-tracers/libf/dyn3d/vlspltqs.F
r2603 r3852 4 4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, 5 5 , p,pk,teta,iq ) 6 USE infotrac, ONLY: nqtot, nqdesc,iqfils6 USE infotrac, ONLY: nqtot, tracers, tra 7 7 c 8 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron … … 45 45 c 46 46 INTEGER i,ij,l,j,ii 47 INTEGER ifils,iq2 ! CRisi 47 INTEGER ichld,iq2 ! CRisi 48 TYPE(tra), POINTER :: tr 48 49 c 49 50 REAL qsat(ip1jmp1,llm) … … 84 85 rtt = 273.16 85 86 87 tr => tracers(iq) 88 86 89 c-- Calcul de Qsat en chaque point 87 90 c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2 … … 121 124 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 122 125 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 123 if ( nqdesc(iq).gt.0) then124 do i fils=1,nqdesc(iq)125 iq2= iqfils(ifils,iq)126 if (tr%ndesc > 0) then 127 do ichld=1,tr%ndesc 128 iq2=tr%idesc(ichld) 126 129 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 127 130 enddo 128 endif !if ( nqfils(iq).gt.0) then131 endif !if (tr%ndesc > 0) 129 132 130 133 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') … … 162 165 ENDDO 163 166 ! CRisi: aussi pour les fils 164 if ( nqdesc(iq).gt.0) then165 do i fils=1,nqdesc(iq)166 iq2= iqfils(ifils,iq)167 if (tr%ndesc > 0) then 168 do ichld=1,tr%ndesc 169 iq2=tr%idesc(ichld) 167 170 DO l=1,llm 168 171 DO ij=1,ip1jmp1 … … 173 176 ENDDO 174 177 ENDDO 175 enddo !do i fils=1,nqdesc(iq)176 endif ! if ( nqfils(iq).gt.0) then178 enddo !do ichld=1,tr%ndesc 179 endif ! if (tr%ndesc > 0) 177 180 !write(*,*) 'vlspltqs 183: fin de la routine' 178 181 … … 180 183 END 181 184 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq) 182 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils! CRisi185 USE infotrac, ONLY : nqtot, tracers, tra ! CRisi 183 186 184 187 c … … 218 221 ! CRisi 219 222 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 220 INTEGER ifils,iq2 ! CRisi 223 INTEGER ichld,iq2 ! CRisi 224 TYPE(tra), POINTER :: tr 221 225 222 226 Logical first,testcpu … … 238 242 first=.false. 239 243 ENDIF 244 245 tr => tracers(iq) 240 246 241 247 c calcul de la pente a droite et a gauche de la maille … … 485 491 !write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq) 486 492 487 if ( nqfils(iq).gt.0) then488 do i fils=1,nqdesc(iq)489 iq2= iqfils(ifils,iq)493 if (tr%ndesc > 0) then 494 do ichld=1,tr%ndesc 495 iq2=tr%idesc(ichld) 490 496 DO l=1,llm 491 497 DO ij=iip2,ip1jm … … 495 501 enddo 496 502 enddo 497 enddo !do i fils=1,nqdesc(iq)498 do i fils=1,nqfils(iq)499 iq2= iqfils(ifils,iq)503 enddo !do ichld=1,nqdesc(iq) 504 do ichld=1,tr%nchld 505 iq2=tr%idesc(ichld) 500 506 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 501 enddo !do i fils=1,nqfils(iq)502 endif !if ( nqfils(iq).gt.0) then507 enddo !do ichld=1,tr%nchld 508 endif !if (tr%ndesc > 0) 503 509 ! end CRisi 504 510 … … 523 529 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 524 530 ! puis on boucle en longitude 525 if ( nqdesc(iq).gt.0) then526 do i fils=1,nqdesc(iq)527 iq2= iqfils(ifils,iq)531 if (tr%ndesc > 0) then 532 do ichld=1,tr%ndesc 533 iq2=tr%idesc(ichld) 528 534 DO l=1,llm 529 535 DO ij=iip2+1,ip1jm … … 534 540 enddo ! DO ij=ijb+iip1-1,ije,iip1 535 541 enddo !DO l=1,llm 536 enddo !do i fils=1,nqdesc(iq)537 endif !if ( nqfils(iq).gt.0) then542 enddo !do ichld=1,tr%ndesc 543 endif !if (tr%ndesc > 0) 538 544 539 545 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 544 550 END 545 551 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq) 546 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils! CRisi552 USE infotrac, ONLY : nqtot, tracers, tra ! CRisi 547 553 c 548 554 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 598 604 599 605 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 600 INTEGER ifils,iq2 ! CRisi 606 INTEGER ichld,iq2 ! CRisi 607 TYPE(tra), POINTER :: tr 601 608 c 602 609 c … … 623 630 ENDIF 624 631 632 tr => tracers(iq) 625 633 c 626 634 … … 796 804 !write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq) 797 805 798 if ( nqfils(iq).gt.0) then799 do i fils=1,nqdesc(iq)800 iq2= iqfils(ifils,iq)806 if (tr%ndesc > 0) then 807 do ichld=1,tr%ndesc 808 iq2=tr%idesc(ichld) 801 809 DO l=1,llm 802 810 DO ij=1,ip1jmp1 … … 805 813 enddo 806 814 enddo 807 enddo !do i fils=1,nqdesc(iq)808 809 do i fils=1,nqfils(iq)810 iq2= iqfils(ifils,iq)815 enddo !do ichld=1,tr%ndesc 816 817 do ichld=1,tr%nchld 818 iq2=tr%idesc(ichld) 811 819 !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 812 820 call vly(Ratio,pente_max,masseq,qbyv,iq2) 813 enddo !do i fils=1,nqfils(iq)814 endif !if ( nqfils(iq).gt.0) then821 enddo !do ichld=1,tr%nchld 822 endif !if (tr%ndesc > 0) 815 823 816 824 DO l=1,llm … … 868 876 869 877 ! retablir les fils en rapport de melange par rapport a l'air: 870 if ( nqdesc(iq).gt.0) then871 do i fils=1,nqdesc(iq)872 iq2= iqfils(ifils,iq)878 if (tr%ndesc > 0) then 879 do ichld=1,tr%ndesc 880 iq2=tr%idesc(ichld) 873 881 DO l=1,llm 874 882 DO ij=1,ip1jmp1 … … 876 884 enddo 877 885 enddo 878 enddo !do i fils=1,nqdesc(iq)879 endif !if ( nqfils(iq).gt.0) then886 enddo !do ichld=1,tr%ndesc 887 endif !if (tr%ndesc > 0) 880 888 !write(*,*) 'vly 879' 881 889
Note: See TracChangeset
for help on using the changeset viewer.