Changeset 425 for branches/GRISLIv3


Ignore:
Timestamp:
04/25/23 11:40:22 (15 months ago)
Author:
dumas
Message:

Use only in out_profile

Location:
branches/GRISLIv3/SOURCES
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/GRISLIv3/SOURCES/3D-physique-gen_mod.f90

    r424 r425  
    7272  !integer, dimension(NX,NY) ::  LIGV    !< numero de ligne de V dans remplidom 
    7373 
    74   integer :: nombre_profils !< nombre de profils de la calotte 
    7574  integer :: itracer                    ! pour ecrire les recovery avec ou sans les tableaux traceurs 
    7675 
  • branches/GRISLIv3/SOURCES/out_profile_mod.f90

    r65 r425  
    1313module out_profile 
    1414 
    15   use module3D_phy 
     15  implicit none 
     16  integer,dimension(:,:),allocatable :: i_prof !< tableau contenant les coordonnees des points des profils,  
     17  !< ici i. la 2eme dimension pour les differents profils  
     18  !< allocation de i_prof et j_prof dans inputfile-vec 
     19  integer,dimension(:,:),allocatable :: j_prof !< tableau contenant les coordonnees des points des profils, 
     20  !<  ici j. la 2eme dimension pour les differents profils 
    1621   
    17  
    18 implicit none 
    19 integer,dimension(:,:),allocatable :: i_prof !< tableau contenant les coordonnees des points des profils,  
    20                                              !< ici i. la 2eme dimension pour les differents profils  
    21                                              !< allocation de i_prof et j_prof dans inputfile-vec 
    22 integer,dimension(:,:),allocatable :: j_prof !< tableau contenant les coordonnees des points des profils, 
    23                                              !<  ici j. la 2eme dimension pour les differents profils  
    24  
    25 integer,dimension(:),allocatable :: nbr_pts_prof          !< nombre de points dans les profils  
    26 integer :: nmax 
    27 integer :: num_geo 
    28  
    29 character (len=50),dimension(:),allocatable :: nom_profil !< nom des fichiers profils 
    30  character(len=30) :: nom_prof 
    31  character(len=80) :: filin 
    32  character(len=7) :: test_geon 
     22  integer :: nombre_profils !< nombre de profils de la calotte 
     23  integer,dimension(:),allocatable :: nbr_pts_prof          !< nombre de points dans les profils  
     24  integer :: nmax 
     25  integer :: num_geo 
     26 
     27  character (len=50),dimension(:),allocatable :: nom_profil !< nom des fichiers profils 
     28  character(len=30) :: nom_prof 
     29  character(len=80) :: filin 
     30  character(len=7) :: test_geon 
    3331 
    3432contains 
    35 !> SUBROUTINE: input_profile 
    36 !! Lecture des coordonnees des points de grille ou passent les profils 
    37 !! @note Lecture des fichiers contenant les points i j des profiles 
    38 !> 
     33  !> SUBROUTINE: input_profile 
     34  !! Lecture des coordonnees des points de grille ou passent les profils 
     35  !! @note Lecture des fichiers contenant les points i j des profiles 
     36  !> 
    3937  subroutine input_profile 
     38     
     39    use module3D_phy, only: num_rep_42,num_file2 
     40    use geography, only: dirnameinp,geoplace 
     41     
     42    integer :: err 
     43    integer :: i, k 
    4044    !====================================== La reponse est num_rep_42 =========== 
    4145    write(num_rep_42,*) 
     
    127131 
    128132  end subroutine input_profile 
    129 !--------------------------------------------------------------------------------------- 
    130 !--------------------------------------------------------------------------------------- 
    131 !--------------------------------------------------------------------------------------- 
    132 !> SUBROUTINE: sortieprofile 
    133 !!Routine de sortie des resultats pour faire des profiles de la calotte 
    134 !!@note Pour l'utilise il est necessaire d'avoir des fichier contenant les traces 
    135 !! des profiles. 
    136 !> 
    137  
    138 subroutine sortieprofile 
    139  
    140 ! routine de sortie des resultats pour faire des profiles de la calotte 
    141 ! Pour l'utilise il est necessaire d'avoir des fichier contenant les traces 
    142 ! des profiles. 
    143  
    144 IMPLICIT NONE 
    145  
    146 integer :: numtime 
    147 !integer :: nmax 
    148 integer :: n 
    149 integer, dimension(:), allocatable :: nbr_ligne_prof 
    150 integer :: nbr_ligne_total 
    151 real :: dxkm , dykm ! resolution en kilometre 
    152 !integer, dimension(200) :: i_prof, j_prof 
    153 real, dimension(400) :: x_profil ! position en km sur le profil 
    154 real, dimension(400,21) :: z_profil ! position verticale en km 
    155 !character (len=52) :: dirname 
    156 character (len=40) :: dirname 
    157 !character (len=47) :: profile1 
    158 character (len=1) :: signe, unite, nt1 
    159 character (len=2) :: nt2 
    160 character (len=3) :: nt3 
    161 character (len=4) :: nt4 
    162 character (len=5) :: nt5 
    163 character (len=80) :: ffinal 
    164 real, dimension(nx,ny) :: smoinsb 
    165  
    166  
    167 !resolution spatiale 
    168 dxkm=dx/1000 
    169 dykm=dy/1000 
    170  
    171 ! allocation de nbr_ligne_prof 
    172 if (.not.allocated(nbr_ligne_prof)) THEN 
    173    allocate(nbr_ligne_prof(nombre_profils),stat=err) 
    174    if (err/=0) then 
    175       print *,"Erreur à l'allocation du tableau nbr_ligne_prof",err 
    176       stop 4 
    177    end if 
    178 end if 
    179  
    180  
    181 DIRNAME=TRIM(DIRNAMEOUT)!DIRNAMEOUT 
    182  
    183  
    184  
    185 ! pour changer de signe entre le passe et le futur 
    186 if (TIME.GT.0.) THEN 
    187    signe= '+' 
    188 else 
    189    signe= '-' 
    190 endif 
    191  
    192  
    193 if (int(mod(abs(TIME),1000.)).eq.0) then 
    194 !     temps multiple de 1000 
    195    unite='k' 
    196    NUMTIME=nint(abs(TIME/1000.)) 
    197 else if (int(mod(abs(TIME),100.)).eq.0) then 
    198 !     temps multiple de 100 
    199    unite='c' 
    200    NUMTIME=nint(abs(TIME/100.)) 
    201 else if (int(mod(abs(TIME),10.)).eq.0) then 
    202 !     temps multiple de 10 
    203    unite='d' 
    204    NUMTIME=nint(abs(TIME/10.)) 
    205 else 
    206 !     temps en annees 
    207    unite='a' 
    208    NUMTIME=nint(abs(TIME/1.)) 
    209 endif 
    210  
    211 921   format(i1) 
    212 922   format(i2) 
    213 923   format(i3) 
    214 924   format(i4) 
    215 925   format(i5) 
    216  
    217  
    218 if (NUMTIME.lt.10) then 
    219    write(nt1,921) NUMTIME 
    220    ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//'00'//nt1//'.prf' 
    221 else if ((NUMTIME.ge.10).and.(NUMTIME.lt.100)) then 
    222    write(nt2,922) NUMTIME 
    223    ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//'0'//nt2//'.prf' 
    224 else if ((NUMTIME.ge.100).and.(NUMTIME.lt.1000)) then 
    225    write(nt3,923) NUMTIME 
    226    ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt3//'.prf' 
    227 else if ((NUMTIME.ge.1000).and.(NUMTIME.lt.10000)) then 
    228    write(nt4,924) NUMTIME 
    229    ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt4//'.prf' 
    230 else if ((NUMTIME.ge.10000).and.(NUMTIME.lt.100000)) then 
    231    write(nt5,925) NUMTIME 
    232    ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt5//'.prf' 
    233 else 
    234    ffinal=TRIM(DIRNAME)//RUNNAME//signe//'out'//'.prf' 
    235 endif 
    236  
    237 open (num_file1,file=FFINAL) 
    238  
    239 nbr_ligne_prof(:)=nbr_pts_prof(:)*21+1 
    240 nbr_ligne_total=sum(nbr_ligne_prof) 
    241  
    242 write(num_file1,*) (nbr_ligne_prof(i),i=1,nombre_profils),nbr_ligne_total 
    243  
    244 ! boucle sur le nombre de profil a effectuer 
    245 Do i=1,nombre_profils 
    246  
    247  
    248  
    249 ! calcul de la position des points sur le profil en km 
    250  
    251  
    252 do k=1,nz 
    253    z_profil(1,k)=S(i_prof(i,1),j_prof(i,1))-((S(i_prof(i,1),j_prof(i,1)) - & 
    254         B(i_prof(i,1),j_prof(i,1)))*(k-1)/20) 
    255 enddo 
    256  
    257  
    258 x_profil(1)= 0 
    259  
    260    do n=2,nbr_pts_prof(i) 
    261       x_profil(n)= x_profil(n-1) + (((i_prof(i,n)-i_prof(i,n-1))*dxkm)**2 + & 
    262                 ((j_prof(i,n)-j_prof(i,n-1))*dykm)**2)**0.5 
    263       SMOINSB(i_prof(i,n),j_prof(i,n))=S(i_prof(i,n),j_prof(i,n)) & 
    264               -B(i_prof(i,n),j_prof(i,n)) 
    265       do k=1,nz 
    266          z_profil(n,k)=S(i_prof(i,n),j_prof(i,n))- & 
    267              (SMOINSB(i_prof(i,n),j_prof(i,n))*(k-1)/20) 
    268       enddo 
    269    enddo 
    270  
    271  
    272  
    273  
    274 !  ecriture du fichier .prf 
    275 !  nombre de ligne du profil 
    276 !  i,j,n,k,x(km),z(km),T,Ux(i,j,1,nz),Ux(i+1,j,1,nz),Uy(i,j,1,nz),Uy(i,j+1,1,nz),UZR(i,j,nz),S,B,BSOC 
    277 ! i et j sont les coordonnees des points dans la grille du modele 
    278 ! n est le no du point horizontalement sur le profil. 1 2 3 4 ... 
    279 ! k est le no verticale sur le profil (de 1 a 21) 
    280 ! B est le fond de la glace 
    281 ! BSOC est le socle 
    282  
    283  
    284 write(num_file1,*) 'i j n k x(km) z(km) T Ux(i,j) Ux(i+1,j) Uy(i,j) Uy(i,j+1) UZR(i,j) S B BSOC' 
    285  
    286 do n=1,nbr_pts_prof(i) 
    287    do k=1,nz 
    288       write(num_file1,912) i_prof(i,n),j_prof(i,n),n,k,x_profil(n),z_profil(n,k), & 
    289             T(i_prof(i,n),j_prof(i,n),k),UX(i_prof(i,n),j_prof(i,n),k), & 
    290             UX(i_prof(i,n)+1,j_prof(i,n),k),UY(i_prof(i,n),j_prof(i,n),k), & 
    291             UY(i_prof(i,n),j_prof(i,n)+1,k),UZR(i_prof(i,n),j_prof(i,n),k), & 
    292         S(i_prof(i,n),j_prof(i,n)),B(i_prof(i,n),j_prof(i,n)),BSOC(i_prof(i,n),j_prof(i,n)) 
    293    enddo 
    294 enddo 
    295  
    296 enddo 
    297 close(num_file1) 
     133  !--------------------------------------------------------------------------------------- 
     134  !--------------------------------------------------------------------------------------- 
     135  !--------------------------------------------------------------------------------------- 
     136  !> SUBROUTINE: sortieprofile 
     137  !!Routine de sortie des resultats pour faire des profiles de la calotte 
     138  !!@note Pour l'utilise il est necessaire d'avoir des fichier contenant les traces 
     139  !! des profiles. 
     140  !> 
     141 
     142  ! routine de sortie des resultats pour faire des profiles de la calotte 
     143  ! Pour l'utilise il est necessaire d'avoir des fichier contenant les traces 
     144  ! des profiles. 
     145  subroutine sortieprofile 
     146     
     147    use module3D_phy, only:time,num_file1,S,B,T,ux,uy,uzr,Bsoc 
     148    use runparam, only: runname,dirnameout 
     149    use geography, only: dx,dy,nz,nx,ny 
     150 
     151    integer :: numtime 
     152    !integer :: nmax 
     153    integer :: n,err,i,k 
     154    integer, dimension(:), allocatable :: nbr_ligne_prof 
     155    integer :: nbr_ligne_total 
     156    real :: dxkm , dykm ! resolution en kilometre 
     157    !integer, dimension(200) :: i_prof, j_prof 
     158    real, dimension(400) :: x_profil ! position en km sur le profil 
     159    real, dimension(400,21) :: z_profil ! position verticale en km 
     160    !character (len=52) :: dirname 
     161    character (len=40) :: dirname 
     162    !character (len=47) :: profile1 
     163    character (len=1) :: signe, unite, nt1 
     164    character (len=2) :: nt2 
     165    character (len=3) :: nt3 
     166    character (len=4) :: nt4 
     167    character (len=5) :: nt5 
     168    character (len=80) :: ffinal 
     169    real, dimension(nx,ny) :: smoinsb 
     170 
     171 
     172    !resolution spatiale 
     173    dxkm=dx/1000 
     174    dykm=dy/1000 
     175 
     176    ! allocation de nbr_ligne_prof 
     177    if (.not.allocated(nbr_ligne_prof)) THEN 
     178       allocate(nbr_ligne_prof(nombre_profils),stat=err) 
     179       if (err/=0) then 
     180          print *,"Erreur à l'allocation du tableau nbr_ligne_prof",err 
     181          stop 4 
     182       end if 
     183    end if 
     184 
     185 
     186    DIRNAME=TRIM(DIRNAMEOUT)!DIRNAMEOUT 
     187 
     188 
     189 
     190    ! pour changer de signe entre le passe et le futur 
     191    if (TIME.GT.0.) THEN 
     192       signe= '+' 
     193    else 
     194       signe= '-' 
     195    endif 
     196 
     197 
     198    if (int(mod(abs(TIME),1000.)).eq.0) then 
     199       !     temps multiple de 1000 
     200       unite='k' 
     201       NUMTIME=nint(abs(TIME/1000.)) 
     202    else if (int(mod(abs(TIME),100.)).eq.0) then 
     203       !     temps multiple de 100 
     204       unite='c' 
     205       NUMTIME=nint(abs(TIME/100.)) 
     206    else if (int(mod(abs(TIME),10.)).eq.0) then 
     207       !     temps multiple de 10 
     208       unite='d' 
     209       NUMTIME=nint(abs(TIME/10.)) 
     210    else 
     211       !     temps en annees 
     212       unite='a' 
     213       NUMTIME=nint(abs(TIME/1.)) 
     214    endif 
     215 
     216921 format(i1) 
     217922 format(i2) 
     218923 format(i3) 
     219924 format(i4) 
     220925 format(i5) 
     221 
     222 
     223    if (NUMTIME.lt.10) then 
     224       write(nt1,921) NUMTIME 
     225       ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//'00'//nt1//'.prf' 
     226    else if ((NUMTIME.ge.10).and.(NUMTIME.lt.100)) then 
     227       write(nt2,922) NUMTIME 
     228       ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//'0'//nt2//'.prf' 
     229    else if ((NUMTIME.ge.100).and.(NUMTIME.lt.1000)) then 
     230       write(nt3,923) NUMTIME 
     231       ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt3//'.prf' 
     232    else if ((NUMTIME.ge.1000).and.(NUMTIME.lt.10000)) then 
     233       write(nt4,924) NUMTIME 
     234       ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt4//'.prf' 
     235    else if ((NUMTIME.ge.10000).and.(NUMTIME.lt.100000)) then 
     236       write(nt5,925) NUMTIME 
     237       ffinal=TRIM(DIRNAME)//RUNNAME//signe//unite//nt5//'.prf' 
     238    else 
     239       ffinal=TRIM(DIRNAME)//RUNNAME//signe//'out'//'.prf' 
     240    endif 
     241 
     242    open (num_file1,file=FFINAL) 
     243 
     244    nbr_ligne_prof(:)=nbr_pts_prof(:)*21+1 
     245    nbr_ligne_total=sum(nbr_ligne_prof) 
     246 
     247    write(num_file1,*) (nbr_ligne_prof(i),i=1,nombre_profils),nbr_ligne_total 
     248 
     249    ! boucle sur le nombre de profil a effectuer 
     250    Do i=1,nombre_profils 
     251 
     252 
     253 
     254       ! calcul de la position des points sur le profil en km 
     255 
     256 
     257       do k=1,nz 
     258          z_profil(1,k)=S(i_prof(i,1),j_prof(i,1))-((S(i_prof(i,1),j_prof(i,1)) - & 
     259               B(i_prof(i,1),j_prof(i,1)))*(k-1)/20) 
     260       enddo 
     261 
     262 
     263       x_profil(1)= 0 
     264 
     265       do n=2,nbr_pts_prof(i) 
     266          x_profil(n)= x_profil(n-1) + (((i_prof(i,n)-i_prof(i,n-1))*dxkm)**2 + & 
     267               ((j_prof(i,n)-j_prof(i,n-1))*dykm)**2)**0.5 
     268          SMOINSB(i_prof(i,n),j_prof(i,n))=S(i_prof(i,n),j_prof(i,n)) & 
     269               -B(i_prof(i,n),j_prof(i,n)) 
     270          do k=1,nz 
     271             z_profil(n,k)=S(i_prof(i,n),j_prof(i,n))- & 
     272                  (SMOINSB(i_prof(i,n),j_prof(i,n))*(k-1)/20) 
     273          enddo 
     274       enddo 
     275 
     276 
     277 
     278 
     279       !  ecriture du fichier .prf 
     280       !  nombre de ligne du profil 
     281       !  i,j,n,k,x(km),z(km),T,Ux(i,j,1,nz),Ux(i+1,j,1,nz),Uy(i,j,1,nz),Uy(i,j+1,1,nz),UZR(i,j,nz),S,B,BSOC 
     282       ! i et j sont les coordonnees des points dans la grille du modele 
     283       ! n est le no du point horizontalement sur le profil. 1 2 3 4 ... 
     284       ! k est le no verticale sur le profil (de 1 a 21) 
     285       ! B est le fond de la glace 
     286       ! BSOC est le socle 
     287 
     288 
     289       write(num_file1,*) 'i j n k x(km) z(km) T Ux(i,j) Ux(i+1,j) Uy(i,j) Uy(i,j+1) UZR(i,j) S B BSOC' 
     290 
     291       do n=1,nbr_pts_prof(i) 
     292          do k=1,nz 
     293             write(num_file1,912) i_prof(i,n),j_prof(i,n),n,k,x_profil(n),z_profil(n,k), & 
     294                  T(i_prof(i,n),j_prof(i,n),k),UX(i_prof(i,n),j_prof(i,n),k), & 
     295                  UX(i_prof(i,n)+1,j_prof(i,n),k),UY(i_prof(i,n),j_prof(i,n),k), & 
     296                  UY(i_prof(i,n),j_prof(i,n)+1,k),UZR(i_prof(i,n),j_prof(i,n),k), & 
     297                  S(i_prof(i,n),j_prof(i,n)),B(i_prof(i,n),j_prof(i,n)),BSOC(i_prof(i,n),j_prof(i,n)) 
     298          enddo 
     299       enddo 
     300 
     301    enddo 
     302    close(num_file1) 
    298303 
    299304912 format(4(i3,1x),11(f8.2,1x)) 
    300 deallocate(nbr_ligne_prof,stat=err) 
    301    if (err/=0) then 
    302       print *,"Erreur à l'allocation du tableau nbr_ligne_prof",err 
    303       stop 4 
    304    end if 
    305  
    306 end subroutine sortieprofile 
    307 !---------------------------------------------------------------------------------------! 
    308 !---------------------------------------------------------------------------------------! 
     305    deallocate(nbr_ligne_prof,stat=err) 
     306    if (err/=0) then 
     307       print *,"Erreur à l'allocation du tableau nbr_ligne_prof",err 
     308       stop 4 
     309    end if 
     310 
     311  end subroutine sortieprofile 
     312  !---------------------------------------------------------------------------------------! 
     313  !---------------------------------------------------------------------------------------! 
    309314end module out_profile 
Note: See TracChangeset for help on using the changeset viewer.