source: LMDZ6/trunk/libf/dyn3d/interp_horiz.f90

Last change on this file was 5246, checked in by abarral, 22 hours ago

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.2 KB
Line 
1!
2! $Id: interp_horiz.f90 5246 2024-10-21 12:58:45Z abarral $
3!
4subroutine interp_horiz (varo,varn,imo,jmo,imn,jmn,lm, &
5        rlonuo,rlatvo,rlonun,rlatvn)
6
7  !===========================================================
8  !  Interpolation Horizontales des variables d'une grille LMDZ
9  ! (des points SCALAIRES au point SCALAIRES)
10  !  dans une autre grille LMDZ en conservant la quantite
11  !  totale pour les variables intensives (/m2) : ex : Pression au sol
12  !
13  ! Francois Forget (01/1995)
14  !===========================================================
15
16  IMPLICIT NONE
17
18  !   Declarations:
19  ! ==============
20  !
21  !  ARGUMENTS
22  !  """""""""
23
24   integer :: imo, jmo ! dimensions ancienne grille (input)
25   integer :: imn,jmn  ! dimensions nouvelle grille (input)
26
27   real :: rlonuo(imo+1)     !  Latitude et
28   real :: rlatvo(jmo)       !  longitude des
29   real :: rlonun(imn+1)     !  bord des
30   real :: rlatvn(jmn)     !  cases "scalaires" (input)
31
32   integer :: lm ! dimension verticale (input)
33   real :: varo (imo+1, jmo+1,lm) ! var dans l'ancienne grille (input)
34   real :: varn (imn+1,jmn+1,lm) ! var dans la nouvelle grille (output)
35
36  ! Autres variables
37  ! """"""""""""""""
38   real :: airetest(imn+1,jmn+1)
39   integer :: ii,jj,l
40
41   real :: airen (imn+1,jmn+1) ! aire dans la nouvelle grille
42  !    Info sur les ktotal intersection entre les cases new/old grille
43   integer :: kllm, k, ktotal
44   parameter (kllm = 400*200*10)
45   integer :: iik(kllm), jjk(kllm),jk(kllm),ik(kllm)
46   real :: intersec(kllm)
47   real :: R
48   real :: totn, tots
49
50   logical :: firstcall, firsttest, aire_ok
51   save firsttest
52   data firsttest /.true./
53   data aire_ok /.true./
54
55
56
57
58
59  ! initialisation
60  ! --------------
61  ! Si c'est le premier appel, on prepare l'interpolation
62  ! en calculant pour chaque case autour d'un point scalaire de la
63  ! nouvelle grille, la surface  de intersection avec chaque
64  !    case de l'ancienne grille.
65
66
67    call iniinterp_horiz (imo,jmo,imn,jmn ,kllm, &
68          rlonuo,rlatvo,rlonun,rlatvn, &
69          ktotal,iik,jjk,jk,ik,intersec,airen)
70
71  do l=1,lm
72   do jj =1 , jmn+1
73    do ii=1, imn+1
74      varn(ii,jj,l) =0.
75    end do
76   end do
77  end do
78
79  ! Interpolation horizontale
80  ! -------------------------
81  ! boucle sur toute les ktotal intersections entre les cases
82  ! de l'ancienne et la  nouvelle grille
83  !
84  PRINT *, 'ktotal 1 = ', ktotal
85
86  do k=1,ktotal
87    do l=1,lm
88     varn(iik(k),jjk(k),l) = varn(iik(k),jjk(k),l) &
89           + varo(ik(k), jk(k),l)*intersec(k)/airen(iik(k),jjk(k))
90    end do
91  end do
92
93  ! Une seule valeur au pole pour les variables ! :
94  ! -----------------------------------------------
95   do l=1, lm
96     totn =0.
97     tots =0.
98       do ii =1, imn+1
99         totn = totn + varn(ii,1,l)
100         tots = tots + varn (ii,jmn+1,l)
101       end do
102       do ii =1, imn+1
103         varn(ii,1,l) = totn/REAL(imn+1)
104         varn(ii,jmn+1,l) = tots/REAL(imn+1)
105       end do
106   end do
107
108
109  !---------------------------------------------------------------
110  !  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST
111  !!       if (.not.(firsttest)) goto 99
112  !!       firsttest = .false.
113  !! !     write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:'
114  !!       do jj =1 , jmn+1
115  !!         do ii=1, imn+1
116  !!           airetest(ii,jj) =0.
117  !!         end do
118  !!       end do
119  !!       PRINT *, 'ktotal = ', ktotal
120  !!       PRINT *, 'jmn+1 =', jmn+1, 'imn+1', imn+1
121  !!
122  !!       do k=1,ktotal
123  !!          airetest(iik(k),jjk(k))= airetest(iik(k),jjk(k)) +intersec(k)
124  !!       end DO
125  !!
126  !!
127  !!       PRINT *, 'fin boucle'
128  !!       do jj =1 , jmn+1
129  !!        do ii=1, imn+1
130  !!          r = airen(ii,jj)/airetest(ii,jj)
131  !!          if ((r.gt.1.001).or.(r.lt.0.999)) then
132  !! !             write (*,*) '********** PROBLEME D'' AIRES !!!',
133  !! !     &                   ' DANS L''INTERPOLATION HORIZONTALE'
134  !! !             write(*,*)'ii,jj,airen,airetest',
135  !! !     &          ii,jj,airen(ii,jj),airetest(ii,jj)
136  !!              aire_ok = .false.
137  !!          end if
138  !!        end do
139  !!       end do
140  !! !      if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK'
141  !!  99   continue
142
143  ! FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST
144  !---------------------------------------------------------------
145
146
147
148
149
150
151
152
153    return
154end subroutine interp_horiz
Note: See TracBrowser for help on using the repository browser.