--- trunk/libf/dyn3d/iniadvtrac.f90 2009/12/14 15:25:16 23 +++ trunk/dyn3d/iniadvtrac.f 2014/03/26 17:18:58 91 @@ -1,6 +1,10 @@ module iniadvtrac_m - ! From advtrac.h, v 1.1.1.1 2004/05/19 12:53:06 + ! From advtrac.h, version 1.1.1.1 2004/05/19 12:53:06 + + ! iq = 1 pour l'eau vapeur + ! iq = 2 pour l'eau liquide + ! et éventuellement iq = 3, ..., nqmx pour les autres traceurs use dimens_m, only: nqmx @@ -8,10 +12,24 @@ private nqmx - INTEGER iadv(nqmx) ! indice schema de transport - INTEGER hadv(nqmx) ! indice schema transport horizontal - INTEGER vadv(nqmx) ! indice schema transport vertical - INTEGER niadv(nqmx) ! equivalent dyn / physique + INTEGER iadv(nqmx) ! indice du schéma d'advection pour l'eau et les traceurs + ! 11 means Van-Leer scheme for hadv et monotonous PPM for vadv + + integer, parameter:: allowed_adv(10) = (/0, 1, 2, 10, 12, 13, 14, 16, 17, 18/) + ! Allowed values for hadv and vadv: + ! 1: schema transport type "humidite specifique LMD" + ! 2: schema amont + ! 10: schema Van-leer (retenu pour l'eau vapeur et liquide) + ! 12: schema Frederic Hourdin I + ! 13: schema Frederic Hourdin II + ! 14: schema Van-leer + humidite specifique + ! 16: schema PPM Monotone(Collela & Woodward 1984) + ! 17: schema PPM Semi Monotone (overshoots autorisés) + ! 18: schema PPM Positif Defini (overshoots undershoots autorisés) + ! Pour Van-Leer plus vapeur d'eau saturée : iadv(1)=4 + + INTEGER hadv(nqmx) ! indice schéma transport horizontal + INTEGER vadv(nqmx) ! indice schéma transport vertical character(len=8) tnom(nqmx) ! nom court du traceur character(len=10) tname(nqmx) ! nom du traceur pour restart character(len=13) ttext(nqmx) ! nom long du traceur pour sorties @@ -22,191 +40,87 @@ ! From dyn3d/iniadvtrac.F, version 1.3 2005/04/13 08:58:34 - ! Authors : P. Le Van, L. Fairhead, F. Hourdin - ! Modification spéciale traceur F. Forget 05/94 - ! Modification M.-A. Filiberti 02/02 lecture de "traceur.def" - ! Modification de l'intégration de "q" (26/04/94) + ! Authors: P. Le Van, L. Fairhead, F. Hourdin, F. Codron, + ! F. Forget, M.-A. Filiberti - use numer_rec, only: assert + use nr_util, only: assert + use jumble, only: new_unit ! Variables local to the procedure: - character(len=3) descrq(30) - character:: txts(3) = (/'x', 'y', 'z'/) - character(len=2) txtp(9) - character(len=13) str1, str2 - - integer iq, iiq, iiiq, ierr, ii, nq_local - - data txtp/'x', 'y', 'z', 'xx', 'xy', 'xz', 'yy', 'yz', 'zz'/ + character(len=3) descrq(18) + integer iq, iostat, nq_local, unit !----------------------------------------------------------------------- print *, "Call sequence information: iniadvtrac" ! Initializations: - descrq(14)='VLH' descrq(10)='VL1' descrq(11)='VLP' descrq(12)='FH1' descrq(13)='FH2' + descrq(14)='VLH' descrq(16)='PPM' descrq(17)='PPS' descrq(18)='PPP' - descrq(20)='SLP' - descrq(30)='PRA' - - ! Choix des schemas d'advection pour l'eau et les traceurs - - ! iadv = 1 schema transport type "humidite specifique LMD" - ! iadv = 2 schema amont - ! iadv = 14 schema Van-leer + humidite specifique - ! Modif F.Codron - ! iadv = 10 schema Van-leer (retenu pour l'eau vapeur et liquide) - ! iadv = 11 schema Van-Leer pour hadv et version PPM (Monotone) - ! pour vadv - ! iadv = 12 schema Frederic Hourdin I - ! iadv = 13 schema Frederic Hourdin II - ! iadv = 16 schema PPM Monotone(Collela & Woodward 1984) - ! iadv = 17 schema PPM Semi Monotone (overshoots autorisés) - ! iadv = 18 schema PPM Positif Defini (overshoots undershoots autorisés) - ! iadv = 20 schema Slopes - ! iadv = 30 schema Prather - - ! Dans le tableau q(ij, l, iq) : iq = 1 pour l'eau vapeur - ! iq = 2 pour l'eau liquide - ! Et éventuellement iq = 3, nqmx pour les autres traceurs - - ! iadv(1): choix pour l'eau vap. et iadv(2) : choix pour l'eau liq. - - ! Choix du schema d'advection - ! choix par defaut = van leer pour tous les traceurs - do iq=1, nqmx - iadv(iq)=10 - str1(1:1)='q' - if (nqmx.le.99) then - WRITE(str1(2:3), '(i2.2)') iq - else - WRITE(str1(2:4), '(i3.3)') iq - endif - tnom(iq)=str1 - tname(iq)=tnom(iq) - str2=tnom(iq) - ttext(iq) = trim(str2) // descrq(iadv(iq)) - end do - ! Choix du schema pour l'advection dans fichier "traceur.def" - - open(unit=90, file='traceur.def', form='formatted', status='old', & - iostat=ierr) - if (ierr == 0) then + ! Choix du schéma pour l'advection dans fichier "traceur.def" + call new_unit(unit) + open(unit, file='traceur.def', status='old', action="read", & + position="rewind", iostat=iostat) + if (iostat == 0) then print *, 'Ouverture de "traceur.def" ok' - read(unit=90, fmt=*) nq_local + read(unit, fmt=*) nq_local print *, 'nombre de traceurs ', nq_local call assert(nq_local == nqmx, "iniadvtrac nq_local") do iq=1, nqmx - read(90, 999) hadv(iq), vadv(iq), tnom(iq) - end do - close(90) - PRINT *, 'lecture de traceur.def :' - do iq=1, nqmx - write(*, *) hadv(iq), vadv(iq), tnom(iq) + read(unit, fmt=*) hadv(iq), vadv(iq), tnom(iq) + if (.not. any(hadv(iq) == allowed_adv) & + .or. .not. any(vadv(iq) == allowed_adv)) then + print *, "bad number for advection scheme" + stop 1 + end if end do + close(unit) else print *, 'Problème à l''ouverture de "traceur.def"' print *, 'Attention : on prend des valeurs par défaut.' call assert(nqmx == 4, "iniadvtrac nqmx") - hadv(1) = 14 - vadv(1) = 14 + hadv(:4) = (/14, 10, 10, 10/) + vadv(:4) = hadv(:4) tnom(1) = 'H2Ov' - hadv(2) = 10 - vadv(2) = 10 tnom(2) = 'H2Ol' - hadv(3) = 10 - vadv(3) = 10 tnom(3) = 'RN' - hadv(4) = 10 - vadv(4) = 10 tnom(4) = 'PB' + do iq = 1, nqmx + print *, hadv(iq), vadv(iq), tnom(iq) + end do ENDIF - PRINT *, 'Valeur de traceur.def :' - do iq=1, nqmx - write(*, *) hadv(iq), vadv(iq), tnom(iq) - end do + + tname = tnom ! À partir du nom court du traceur et du schéma d'advection, on - ! détemine le nom long : - iiq=0 - ii=0 - do iq=1, nqmx - iiq=iiq+1 + ! détermine le nom long : + do iq = 1, nqmx if (hadv(iq) /= vadv(iq)) then - if (hadv(iq) == 10.and.vadv(iq) == 16) then - iadv(iiq)=11 + if (hadv(iq) == 10 .and. vadv(iq) == 16) then + iadv(iq) = 11 else - print *, 'le choix des schemas d''advection H et V' - print *, 'est non disponible actuellement' - stop + print *, "Bad combination for hozizontal and vertical schemes." + stop 1 endif else - iadv(iiq)=hadv(iq) - endif - ! verification nombre de traceurs - if (iadv(iiq).lt.20) then - ii=ii+1 - elseif (iadv(iiq) == 20) then - ii=ii+4 - elseif (iadv(iiq) == 30) then - ii=ii+10 + iadv(iq) = hadv(iq) endif - str1=tnom(iq) - tname(iiq)=tnom(iq) - IF (iadv(iiq) == 0) THEN - ttext(iiq)=trim(str1) + IF (iadv(iq) == 0) THEN + ttext(iq) = tnom(iq) ELSE - ttext(iiq)=trim(str1)//descrq(iadv(iiq)) - endif - str2=ttext(iiq) - ! schemas tenant compte des moments d'ordre superieur. - if (iadv(iiq) == 20) then - do iiiq=1, 3 - iiq=iiq+1 - iadv(iiq)=-20 - ttext(iiq)=trim(str2)//txts(iiiq) - tname(iiq)=trim(str1)//txts(iiiq) - enddo - elseif (iadv(iiq) == 30) then - do iiiq=1, 9 - iiq=iiq+1 - iadv(iiq)=-30 - ttext(iiq)=trim(str2)//txtp(iiiq) - tname(iiq)=trim(str1)//txtp(iiiq) - enddo + ttext(iq)=trim(tnom(iq)) // descrq(iadv(iq)) endif end do - if (ii /= nqmx) then - print *, 'WARNING' - print *, 'le nombre de traceurs et de moments eventuels' - print *, 'est inferieur a nqmx ' - endif - if (iiq > nqmx) then - print *, 'le choix des schemas est incompatible avec ' - print *, 'la dimension nqmx (nombre de traceurs)' - print *, 'verifier traceur.def ou la namelist INCA' - print *, 'ou recompiler avec plus de traceurs' - stop - endif - iiq=0 - do iq=1, nqmx - if (iadv(iq).ge.0) then - iiq=iiq+1 - niadv(iiq)=iq - endif - end do - -999 format (i2, 1x, i2, 1x, a8) END subroutine iniadvtrac