1 | !> \file surface-0.3.f90 |
---|
2 | !! Calcule de l'altitude de la surface tous les DTT (pas de temps) |
---|
3 | !< |
---|
4 | |
---|
5 | !> SUBROUTINE: SURFACE() |
---|
6 | !! \author Christophe Dumas |
---|
7 | !! \date Mai 2000 |
---|
8 | !! @note Routine qui calcul l'altitude de la surface tous les DTT (pas de temps) |
---|
9 | !! @note Iterations jusqu'a stabilisation de la surface. |
---|
10 | !! @note Les changements d'altitude de la surface sont limites a 1 m a chaque |
---|
11 | !! iteration. |
---|
12 | !! @note Used modules: |
---|
13 | !! @note - use module3D_phy |
---|
14 | !! @note - use RELAXATION_MOD |
---|
15 | !! |
---|
16 | !< |
---|
17 | |
---|
18 | |
---|
19 | ! ***************************************************************** |
---|
20 | ! |
---|
21 | ! |
---|
22 | ! |
---|
23 | ! Christophe Dumas, Mai 2000 |
---|
24 | ! |
---|
25 | ! routine qui calcul l'altitude de la surface tous les DTT (pas de temps) |
---|
26 | ! iterations jusqu'a stabilisation de la surface. |
---|
27 | ! les changements d'altitude de la surface sont limites a 1 m a chaque |
---|
28 | ! iteration. |
---|
29 | ! |
---|
30 | ! ***************************************************************** |
---|
31 | |
---|
32 | subroutine SURFACE() |
---|
33 | |
---|
34 | USE module3D_phy |
---|
35 | |
---|
36 | USE RELAXATION_MOD ! module contenant la routine relaxation |
---|
37 | ! avec interface explicite |
---|
38 | |
---|
39 | IMPLICIT NONE |
---|
40 | |
---|
41 | INTEGER :: ntour |
---|
42 | INTEGER :: compteur_limitation !< compteur du nbr de points ou on a limite |
---|
43 | INTEGER :: NXlocal,NYlocal !< pour pouvoir passer NX et NY en parametre a la routine relaxation |
---|
44 | REAL :: dtsdx |
---|
45 | REAL :: difH |
---|
46 | REAL,dimension(NX,NY) :: vieuxH,vieuxH1 !< ancienne valeur de H |
---|
47 | REAL :: SURNET !< permet le calcul de l'altitude de la surface qd la glace flotte |
---|
48 | |
---|
49 | ! initialisation des variables |
---|
50 | !------------------------------ |
---|
51 | NXlocal=NX |
---|
52 | NYlocal=NY |
---|
53 | ntour=0 |
---|
54 | DT= DTT |
---|
55 | dtsdx= dt/dx |
---|
56 | compteur_limitation= 51 |
---|
57 | |
---|
58 | ! Copie de H sur vieuxH |
---|
59 | ! -------------------- |
---|
60 | |
---|
61 | |
---|
62 | vieuxH(:,:)= H(:,:) |
---|
63 | vieuxH1(:,:)=H(:,:) |
---|
64 | write(6,*) H(70,60) |
---|
65 | ! resolution de l'equation de relaxation avec le pas de temps DTT |
---|
66 | |
---|
67 | |
---|
68 | ! DO WHILE ((compteur_limitation.GT.50)) |
---|
69 | DO WHILE ((compteur_limitation.GT.50).AND.(ntour.LT.20)) |
---|
70 | |
---|
71 | compteur_limitation = 0 |
---|
72 | ntour = ntour + 1 |
---|
73 | |
---|
74 | |
---|
75 | CALL RELAXATION(NXlocal,NYlocal,MK,MARINE,FLOT,DTT,DX,vieuxH,BM,BMELT,UXBAR,UYBAR,H,HDOT) |
---|
76 | |
---|
77 | |
---|
78 | |
---|
79 | ! pour empecher de partir vers des valeurs trop elevees on limite a 1 m les variations |
---|
80 | write(6,*) H(70,60) |
---|
81 | do i=1,NX |
---|
82 | do j=1,NY |
---|
83 | difH= H(i,j) - vieuxH1(i,j) |
---|
84 | |
---|
85 | IF ((ABS(difH)).GT.1.) THEN |
---|
86 | compteur_limitation = compteur_limitation + 1 |
---|
87 | IF (difH.GT.0.) THEN |
---|
88 | H(I,J)= vieuxH1(I,J) + 1. |
---|
89 | ELSE |
---|
90 | H(I,J)= vieuxH1(I,J) - 1. |
---|
91 | ENDIF |
---|
92 | ENDIF |
---|
93 | enddo |
---|
94 | enddo |
---|
95 | write(6,*) H(70,60) |
---|
96 | H(:,:)=MAX(H(:,:),1.) |
---|
97 | vieuxH1(:,:)=H(:,:) |
---|
98 | |
---|
99 | |
---|
100 | !************************************* |
---|
101 | ! passage par diffusiv et Neffect pour avoir les vitesses diagnostiques |
---|
102 | call Neffect() |
---|
103 | call DIFFUSIV() |
---|
104 | |
---|
105 | |
---|
106 | do i=1,nx |
---|
107 | do j=1,ny |
---|
108 | IF (.NOT.FLOT(I,J)) then |
---|
109 | S(I,J)=BSOC(I,J)+H(I,J) |
---|
110 | ELSE |
---|
111 | SURNET = H(I,J) * (1.-RO/ROW) |
---|
112 | S(I,J) = SURNET + SEALEVEL |
---|
113 | B(I,J) = S(I,J) - H(I,J) |
---|
114 | END IF |
---|
115 | end do |
---|
116 | end do |
---|
117 | |
---|
118 | |
---|
119 | |
---|
120 | debug_3D(:,:,87)=S(:,:)-debug_3D(:,:,88) |
---|
121 | |
---|
122 | ENDDO |
---|
123 | |
---|
124 | |
---|
125 | TIME= TIME + DTT |
---|
126 | ISYNCHRO=1 |
---|
127 | |
---|
128 | write(6,*) 'nbr d iterations dans surface', ntour |
---|
129 | |
---|
130 | END SUBROUTINE SURFACE |
---|