New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
diaharm.F90 in trunk/NEMOGCM/NEMO/OPA_SRC/DIA – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90 @ 4624

Last change on this file since 4624 was 4624, checked in by acc, 10 years ago

#1305. Fix slow start-up problems on some systems by introducing and using lwm logical to restrict output of merged namelists to the first (or only) processor. lwm is true only on the first processor regardless of ln_ctl. Small changes to all flavours of nemogcm.F90 are also required to write namctl and namcfg after the call to mynode which now opens output.namelist.dyn and writes nammpp.

File size: 19.6 KB
RevLine 
[2956]1MODULE diaharm 
[4292]2   !!======================================================================
[2956]3   !!                       ***  MODULE  diaharm  ***
4   !! Harmonic analysis of tidal constituents
[4292]5   !!======================================================================
6   !! History :  3.1  !  2007  (O. Le Galloudec, J. Chanut)  Original code
7   !!----------------------------------------------------------------------
8#if defined key_diaharm && defined key_tide
9   !!----------------------------------------------------------------------
10   !!   'key_diaharm'
11   !!   'key_tide'
12   !!----------------------------------------------------------------------
[2956]13   USE oce             ! ocean dynamics and tracers variables
14   USE dom_oce         ! ocean space and time domain
15   USE phycst
16   USE dynspg_oce
[3042]17   USE dynspg_ts
[2956]18   USE daymod
19   USE tide_mod
[4292]20   USE in_out_manager  ! I/O units
21   USE iom             ! I/0 library
22   USE ioipsl          ! NetCDF IPSL library
23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
24   USE diadimg         ! To write dimg
[3294]25   USE timing          ! preformance summary
26   USE wrk_nemo        ! working arrays
[2956]27
28   IMPLICIT NONE
29   PRIVATE
[3294]30
31   LOGICAL, PUBLIC, PARAMETER :: lk_diaharm  = .TRUE.
[2956]32   
[3294]33   INTEGER, PARAMETER :: jpincomax    = 2.*jpmax_harmo
34   INTEGER, PARAMETER :: jpdimsparse  = jpincomax*300*24
[2956]35
[4292]36   !                            !!!namelist variables
37   INTEGER ::   nit000_han    ! First time step used for harmonic analysis
38   INTEGER ::   nitend_han    ! Last time step used for harmonic analysis
39   INTEGER ::   nstep_han     ! Time step frequency for harmonic analysis
40   INTEGER ::   nb_ana           ! Number of harmonics to analyse
[2956]41
[4292]42   INTEGER , ALLOCATABLE, DIMENSION(:)       ::   name
43   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ana_temp
44   REAL(wp), ALLOCATABLE, DIMENSION(:)       ::   ana_freq, ut   , vt   , ft
45   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   out_eta , out_u, out_v
[2956]46
[4292]47   INTEGER ::   ninco, nsparse
48   INTEGER ,       DIMENSION(jpdimsparse)         ::   njsparse, nisparse
49   INTEGER , SAVE, DIMENSION(jpincomax)           ::   ipos1
50   REAL(wp),       DIMENSION(jpdimsparse)         ::   valuesparse
51   REAL(wp),       DIMENSION(jpincomax)           ::   ztmp4 , ztmp7
52   REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) ::   ztmp3 , zpilier
53   REAL(wp), SAVE, DIMENSION(jpincomax)           ::   zpivot
[3294]54
[4292]55   CHARACTER (LEN=4), DIMENSION(jpmax_harmo) ::   tname   ! Names of tidal constituents ('M2', 'K1',...)
[2956]56
[4292]57   PUBLIC   dia_harm   ! routine called by step.F90
[2956]58
[4292]59   !!----------------------------------------------------------------------
60   !! NEMO/OPA 3.5 , NEMO Consortium (2013)
61   !! $Id:$
62   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
63   !!----------------------------------------------------------------------
[2956]64CONTAINS
65
66   SUBROUTINE dia_harm_init 
67      !!----------------------------------------------------------------------
68      !!                 ***  ROUTINE dia_harm_init  ***
69      !!         
70      !! ** Purpose :   Initialization of tidal harmonic analysis
71      !!
[3038]72      !! ** Method  :   Initialize frequency array and  nodal factor for nit000_han
[2956]73      !!
74      !!--------------------------------------------------------------------
75      INTEGER :: jh, nhan, jk, ji
[4147]76      INTEGER ::   ios                 ! Local integer output status for namelist read
[2956]77
[3294]78      NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, tname
[2956]79      !!----------------------------------------------------------------------
80
[3294]81      IF(lwp) THEN
82         WRITE(numout,*)
83         WRITE(numout,*) 'dia_harm_init: Tidal harmonic analysis initialization'
84         WRITE(numout,*) '~~~~~~~ '
85      ENDIF
86      !
87      CALL tide_init_Wave
88      !
[4147]89      REWIND( numnam_ref )              ! Namelist nam_diaharm in reference namelist : Tidal harmonic analysis
90      READ  ( numnam_ref, nam_diaharm, IOSTAT = ios, ERR = 901)
91901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diaharm in reference namelist', lwp )
92
93      REWIND( numnam_cfg )              ! Namelist nam_diaharm in configuration namelist : Tidal harmonic analysis
94      READ  ( numnam_cfg, nam_diaharm, IOSTAT = ios, ERR = 902 )
95902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diaharm in configuration namelist', lwp )
[4624]96      IF(lwm) WRITE ( numond, nam_diaharm )
[3294]97      !
98      IF(lwp) THEN
99         WRITE(numout,*) 'First time step used for analysis:  nit000_han= ', nit000_han
100         WRITE(numout,*) 'Last  time step used for analysis:  nitend_han= ', nitend_han
101         WRITE(numout,*) 'Time step frequency for harmonic analysis:  nstep_han= ', nstep_han
[2956]102      ENDIF
103
104      ! Basic checks on harmonic analysis time window:
105      ! ----------------------------------------------
[4292]106      IF( nit000 > nit000_han )   CALL ctl_stop( 'dia_harm_init : nit000_han must be greater than nit000',   &
107         &                                       ' restart capability not implemented' )
108      IF( nitend < nitend_han )   CALL ctl_stop( 'dia_harm_init : nitend_han must be lower than nitend',   &
109         &                                       'restart capability not implemented' )
[2956]110
[4292]111      IF( MOD( nitend_han-nit000_han+1 , nstep_han ) /= 0 )   &
112         &                        CALL ctl_stop( 'dia_harm_init : analysis time span must be a multiple of nstep_han' )
[2956]113
[4292]114      nb_ana = 0
[3294]115      DO jk=1,jpmax_harmo
116         DO ji=1,jpmax_harmo
117            IF(TRIM(tname(jk)) == Wave(ji)%cname_tide) THEN
118               nb_ana=nb_ana+1
119            ENDIF
120         END DO
121      ENDDO
122      !
123      IF(lwp) THEN
124         WRITE(numout,*) '        Namelist nam_diaharm'
125         WRITE(numout,*) '        nb_ana    = ', nb_ana
126         CALL flush(numout)
127      ENDIF
128      !
129      IF (nb_ana > jpmax_harmo) THEN
130        IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nb_ana must be lower than jpmax_harmo, stop'
131        IF(lwp) WRITE(numout,*) ' jpmax_harmo= ', jpmax_harmo
132        nstop = nstop + 1
133      ENDIF
[2956]134
135      ALLOCATE(name    (nb_ana))
136      DO jk=1,nb_ana
137       DO ji=1,jpmax_harmo
138          IF (TRIM(tname(jk)) .eq. Wave(ji)%cname_tide) THEN
139             name(jk) = ji
140             EXIT
141          END IF
142       END DO
143      END DO
144
145      ! Initialize frequency array:
146      ! ---------------------------
[4292]147      ALLOCATE( ana_freq(nb_ana), ut(nb_ana), vt(nb_ana), ft(nb_ana) )
[2956]148
[4292]149      CALL tide_harmo( ana_freq, vt, ut, ft, name, nb_ana )
[2956]150
[2964]151      IF(lwp) WRITE(numout,*) 'Analysed frequency  : ',nb_ana ,'Frequency '
[2956]152
153      DO jh = 1, nb_ana
154        IF(lwp) WRITE(numout,*) '                    : ',tname(jh),' ',ana_freq(jh)
155      END DO
156
157      ! Initialize temporary arrays:
158      ! ----------------------------
[4292]159      ALLOCATE( ana_temp(jpi,jpj,2*nb_ana,3) )
[2956]160      ana_temp(:,:,:,:) = 0.e0
161
162   END SUBROUTINE dia_harm_init
[4292]163
164
[2956]165   SUBROUTINE dia_harm ( kt )
166      !!----------------------------------------------------------------------
167      !!                 ***  ROUTINE dia_harm  ***
168      !!         
169      !! ** Purpose :   Tidal harmonic analysis main routine
170      !!
[3038]171      !! ** Action  :   Sums ssh/u/v over time analysis [nit000_han,nitend_han]
[2956]172      !!
173      !!--------------------------------------------------------------------
174      INTEGER, INTENT( IN ) :: kt
[4292]175      !
[3294]176      INTEGER  :: ji, jj, jh, jc, nhc
[2956]177      REAL(wp) :: ztime, ztemp
[3294]178      !!--------------------------------------------------------------------
179      IF( nn_timing == 1 )   CALL timing_start('dia_harm')
[2956]180
[4292]181      IF ( kt == nit000 ) CALL dia_harm_init
[2956]182
183      IF ( ((kt.GE.nit000_han).AND.(kt.LE.nitend_han)).AND. &
184           (MOD(kt,nstep_han).EQ.0) ) THEN
185
[3294]186        ztime = (kt-nit000+1)*rdt 
[2956]187       
188        nhc = 0
189        DO jh = 1,nb_ana
190          DO jc = 1,2
191            nhc = nhc+1
192            ztemp =(     MOD(jc,2) * ft(jh) *COS(ana_freq(jh)*ztime + vt(jh) + ut(jh))  &
193                    +(1.-MOD(jc,2))* ft(jh) *SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh)))
194
195            DO jj = 1,jpj
196              DO ji = 1,jpi
197                ! Elevation
[4292]198                ana_temp(ji,jj,nhc,1) = ana_temp(ji,jj,nhc,1) + ztemp*sshn(ji,jj)           *tmask(ji,jj,1)       
[2956]199#if defined key_dynspg_ts
[4292]200                ana_temp(ji,jj,nhc,2) = ana_temp(ji,jj,nhc,2) + ztemp*un_b(ji,jj)*hur(ji,jj)*umask(ji,jj,1)
201                ana_temp(ji,jj,nhc,3) = ana_temp(ji,jj,nhc,3) + ztemp*vn_b(ji,jj)*hvr(ji,jj)*vmask(ji,jj,1)
[2956]202#endif
203              END DO
204            END DO
205
206          END DO
207        END DO
208       
209      END IF
210
[4292]211      IF ( kt == nitend_han )   CALL dia_harm_end
[2956]212
[3294]213      IF( nn_timing == 1 )   CALL timing_stop('dia_harm')
[2956]214 
215   END SUBROUTINE dia_harm
216
[4292]217
[2956]218   SUBROUTINE dia_harm_end
219      !!----------------------------------------------------------------------
220      !!                 ***  ROUTINE diaharm_end  ***
221      !!         
[3038]222      !! ** Purpose :  Compute the Real and Imaginary part of tidal constituents
[2956]223      !!
[3038]224      !! ** Action  :  Decompose the signal on the harmonic constituents
[2956]225      !!
226      !!--------------------------------------------------------------------
227      INTEGER :: ji, jj, jh, jc, jn, nhan, jl
228      INTEGER :: ksp, kun, keq
229      REAL(wp) :: ztime, ztime_ini, ztime_end
230      REAL(wp) :: X1,X2
[3294]231      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ana_amp
232      !!--------------------------------------------------------------------
233      CALL wrk_alloc( jpi , jpj , jpmax_harmo , 2 , ana_amp )
[2956]234
[3294]235      IF(lwp) WRITE(numout,*)
236      IF(lwp) WRITE(numout,*) 'anharmo_end: kt=nitend_han: Perform harmonic analysis'
237      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
[2956]238
[3294]239      ztime_ini = nit000_han*rdt                 ! Initial time in seconds at the beginning of analysis
240      ztime_end = nitend_han*rdt                 ! Final time in seconds at the end of analysis
241      nhan = (nitend_han-nit000_han+1)/nstep_han ! Number of dumps used for analysis
[2956]242
[3294]243      ninco = 2*nb_ana
[2956]244
[3294]245      ksp = 0
246      keq = 0       
247      DO jn = 1, nhan
248         ztime=( (nhan-jn)*ztime_ini + (jn-1)*ztime_end )/FLOAT(nhan-1)
249         keq = keq + 1
250         kun = 0
251         DO jh = 1,nb_ana
[2956]252            DO jc = 1,2
[3294]253               kun = kun + 1
254               ksp = ksp + 1
255               nisparse(ksp) = keq
256               njsparse(ksp) = kun
[4292]257               valuesparse(ksp) = (   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh))   &
258                  &             + (1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh)) )
[2956]259            END DO
[3294]260         END DO
261      END DO
[2956]262
[4292]263      nsparse = ksp
[2956]264
[3294]265      ! Elevation:
266      DO jj = 1, jpj
267         DO ji = 1, jpi
[2956]268            ! Fill input array
[4292]269            kun = 0
270            DO jh = 1, nb_ana
271               DO jc = 1, 2
[3294]272                  kun = kun + 1
273                  ztmp4(kun)=ana_temp(ji,jj,kun,1)
[4292]274               END DO
275            END DO
[2956]276
277            CALL SUR_DETERMINE(jj)
278
279            ! Fill output array
280            DO jh = 1, nb_ana
[3294]281               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1)
282               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2)
[2956]283            END DO
[3294]284         END DO
285      END DO
[2956]286
[4292]287      ALLOCATE( out_eta(jpi,jpj,2*nb_ana),   & 
288         &      out_u  (jpi,jpj,2*nb_ana),   &
289         &      out_v  (jpi,jpj,2*nb_ana)  )
[2956]290
[3294]291      DO jj = 1, jpj
292         DO ji = 1, jpi
[2956]293            DO jh = 1, nb_ana 
[4292]294               X1 = ana_amp(ji,jj,jh,1)
295               X2 =-ana_amp(ji,jj,jh,2)
296               out_eta(ji,jj,jh       ) = X1 * tmask(ji,jj,1)
297               out_eta(ji,jj,jh+nb_ana) = X2 * tmask(ji,jj,1)
[2956]298            ENDDO
[3294]299         ENDDO
300      ENDDO
[2956]301
[3294]302      ! ubar:
303      DO jj = 1, jpj
304         DO ji = 1, jpi
[2956]305            ! Fill input array
306            kun=0
307            DO jh = 1,nb_ana
[3294]308               DO jc = 1,2
309                  kun = kun + 1
310                  ztmp4(kun)=ana_temp(ji,jj,kun,2)
311               ENDDO
[2956]312            ENDDO
313
314            CALL SUR_DETERMINE(jj+1)
315
316            ! Fill output array
317            DO jh = 1, nb_ana
[3294]318               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1)
319               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2)
[2956]320            END DO
321
[3294]322         END DO
323      END DO
[2956]324
[3294]325      DO jj = 1, jpj
326         DO ji = 1, jpi
[2956]327            DO jh = 1, nb_ana 
[3294]328               X1=ana_amp(ji,jj,jh,1)
329               X2=-ana_amp(ji,jj,jh,2)
330               out_u(ji,jj,jh) = X1 * umask(ji,jj,1)
331               out_u (ji,jj,nb_ana+jh) = X2 * umask(ji,jj,1)
[2956]332            ENDDO
[3294]333         ENDDO
334      ENDDO
[2956]335
[3294]336      ! vbar:
337      DO jj = 1, jpj
338         DO ji = 1, jpi
339            ! Fill input array
340            kun=0
341            DO jh = 1,nb_ana
342               DO jc = 1,2
[2956]343                  kun = kun + 1
[3294]344                  ztmp4(kun)=ana_temp(ji,jj,kun,3)
345               ENDDO
346            ENDDO
[2956]347
[3294]348            CALL SUR_DETERMINE(jj+1)
[2956]349
[3294]350            ! Fill output array
351            DO jh = 1, nb_ana
352               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1)
353               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2)
354            END DO
[2956]355
[3294]356         END DO
357      END DO
[2956]358
[3294]359      DO jj = 1, jpj
360         DO ji = 1, jpi
[2956]361            DO jh = 1, nb_ana 
[3294]362               X1=ana_amp(ji,jj,jh,1)
363               X2=-ana_amp(ji,jj,jh,2)
364               out_v(ji,jj,jh)=X1 * vmask(ji,jj,1)
365               out_v(ji,jj,nb_ana+jh)=X2 * vmask(ji,jj,1)
[2956]366            ENDDO
[3294]367         ENDDO
368      ENDDO
[2956]369
[3294]370      CALL dia_wri_harm ! Write results in files
371      CALL wrk_dealloc( jpi , jpj , jpmax_harmo , 2 , ana_amp )
372      !
373   END SUBROUTINE dia_harm_end
[2956]374
[4292]375
[3294]376   SUBROUTINE dia_wri_harm
[2956]377      !!--------------------------------------------------------------------
378      !!                 ***  ROUTINE dia_wri_harm  ***
379      !!         
380      !! ** Purpose : Write tidal harmonic analysis results in a netcdf file
381      !!--------------------------------------------------------------------
382      CHARACTER(LEN=lc) :: cltext
383      CHARACTER(LEN=lc) ::   &
[3294]384         cdfile_name_T   ,   & ! name of the file created (T-points)
385         cdfile_name_U   ,   & ! name of the file created (U-points)
386         cdfile_name_V         ! name of the file created (V-points)
387      INTEGER  ::   jh
[2956]388      !!----------------------------------------------------------------------
389
390#if defined key_dimgout
391      cdfile_name_T = TRIM(cexper)//'_Tidal_harmonics_gridT.dimgproc'
392      cdfile_name_U = TRIM(cexper)//'_Tidal_harmonics_gridU.dimgproc'
393      cdfile_name_V = TRIM(cexper)//'_Tidal_harmonics_gridV.dimgproc'
394#endif
395
396      IF(lwp) WRITE(numout,*) '  '
[3294]397      IF(lwp) WRITE(numout,*) 'dia_wri_harm : Write harmonic analysis results'
[2956]398#if defined key_dimgout
399      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~  Output files: ', TRIM(cdfile_name_T)
400      IF(lwp) WRITE(numout,*) '                             ', TRIM(cdfile_name_U)
401      IF(lwp) WRITE(numout,*) '                             ', TRIM(cdfile_name_V)
402#endif
403      IF(lwp) WRITE(numout,*) '  '
404
405      ! A) Elevation
406      !/////////////
407      !
408#if defined key_dimgout
409      cltext='Elevation amplitude and phase'
410      CALL dia_wri_dimg(TRIM(cdfile_name_T), TRIM(cltext), out_eta, 2*nb_ana, '2')
411#else
412      DO jh = 1, nb_ana
413      CALL iom_put( TRIM(tname(jh))//'x', out_eta(:,:,jh) )
414      CALL iom_put( TRIM(tname(jh))//'y', out_eta(:,:,nb_ana+jh) )
415      END DO
416#endif
417
418      ! B) ubar
419      !/////////
420      !
421#if defined key_dimgout
422      cltext='ubar amplitude and phase'
423      CALL dia_wri_dimg(TRIM(cdfile_name_U), TRIM(cltext), out_u, 2*nb_ana, '2')
424#else
425      DO jh = 1, nb_ana
426      CALL iom_put( TRIM(tname(jh))//'x_u', out_u(:,:,jh) )
427      CALL iom_put( TRIM(tname(jh))//'y_u', out_u(:,:,nb_ana+jh) )
428      END DO
429#endif
430
431      ! C) vbar
432      !/////////
433      !
434#if defined key_dimgout
435      cltext='vbar amplitude and phase'
436      CALL dia_wri_dimg(TRIM(cdfile_name_V), TRIM(cltext), out_v, 2*nb_ana, '2')
437#else
438      DO jh = 1, nb_ana
[4292]439         CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh       ) )
440         CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,jh+nb_ana) )
[2956]441      END DO
442#endif
443
[3294]444   END SUBROUTINE dia_wri_harm
[2956]445
[4292]446
[3294]447   SUBROUTINE SUR_DETERMINE(init)
448   !!---------------------------------------------------------------------------------
449   !!                      *** ROUTINE SUR_DETERMINE ***
450   !!   
451   !!   
452   !!       
453   !!---------------------------------------------------------------------------------
[4292]454   INTEGER, INTENT(in) ::   init 
455   !
[3294]456   INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd
457   REAL(wp)                        :: zval1, zval2, zx1
458   REAL(wp), POINTER, DIMENSION(:) :: ztmpx, zcol1, zcol2
459   INTEGER , POINTER, DIMENSION(:) :: ipos2, ipivot
460   !---------------------------------------------------------------------------------
461   CALL wrk_alloc( jpincomax , ztmpx , zcol1 , zcol2 )
462   CALL wrk_alloc( jpincomax , ipos2 , ipivot        )
463           
[4292]464   IF( init == 1 ) THEN
465      IF( nsparse > jpdimsparse )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse')
466      IF( ninco   > jpincomax   )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax')
467      !
468      ztmp3(:,:) = 0._wp
469      !
[3294]470      DO jk1_sd = 1, nsparse
471         DO jk2_sd = 1, nsparse
[4292]472            nisparse(jk2_sd) = nisparse(jk2_sd)
473            njsparse(jk2_sd) = njsparse(jk2_sd)
[3294]474            IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN
475               ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))  &
476                                                        + valuesparse(jk1_sd)*valuesparse(jk2_sd)
477            ENDIF
[4292]478         END DO
479      END DO
[3294]480
481      DO jj_sd = 1 ,ninco
482          ipos1(jj_sd) = jj_sd
483          ipos2(jj_sd) = jj_sd
484      ENDDO
485
486      DO ji_sd = 1 , ninco
487
488         !find greatest non-zero pivot:
489         zval1 = ABS(ztmp3(ji_sd,ji_sd))
490
491         ipivot(ji_sd) = ji_sd
492         DO jj_sd = ji_sd, ninco
493            zval2 = ABS(ztmp3(ji_sd,jj_sd))
494            IF( zval2.GE.zval1 )THEN
495               ipivot(ji_sd) = jj_sd
496               zval1         = zval2
497            ENDIF
498         ENDDO
499
500         DO ji1_sd = 1, ninco
501            zcol1(ji1_sd)               = ztmp3(ji1_sd,ji_sd)
502            zcol2(ji1_sd)               = ztmp3(ji1_sd,ipivot(ji_sd))
503            ztmp3(ji1_sd,ji_sd)         = zcol2(ji1_sd)
504            ztmp3(ji1_sd,ipivot(ji_sd)) = zcol1(ji1_sd)
505         ENDDO
506
507         ipos2(ji_sd)         = ipos1(ipivot(ji_sd))
508         ipos2(ipivot(ji_sd)) = ipos1(ji_sd)
509         ipos1(ji_sd)         = ipos2(ji_sd)
510         ipos1(ipivot(ji_sd)) = ipos2(ipivot(ji_sd))
511         zpivot(ji_sd)        = ztmp3(ji_sd,ji_sd)
512         DO jj_sd = 1, ninco
513            ztmp3(ji_sd,jj_sd) = ztmp3(ji_sd,jj_sd) / zpivot(ji_sd)
514         ENDDO
515
516         DO ji2_sd = ji_sd+1, ninco
517            zpilier(ji2_sd,ji_sd)=ztmp3(ji2_sd,ji_sd)
518            DO jj_sd=1,ninco
519               ztmp3(ji2_sd,jj_sd)=  ztmp3(ji2_sd,jj_sd) - ztmp3(ji_sd,jj_sd) * zpilier(ji2_sd,ji_sd)
520            ENDDO
521         ENDDO
522
523      ENDDO
524
525   ENDIF ! End init==1
526
527   DO ji_sd = 1, ninco
528      ztmp4(ji_sd) = ztmp4(ji_sd) / zpivot(ji_sd)
529      DO ji2_sd = ji_sd+1, ninco
530         ztmp4(ji2_sd) = ztmp4(ji2_sd) - ztmp4(ji_sd) * zpilier(ji2_sd,ji_sd)
531      ENDDO
532   ENDDO
533
534   !system solving:
535   ztmpx(ninco) = ztmp4(ninco) / ztmp3(ninco,ninco)
536   ji_sd = ninco
537   DO ji_sd = ninco-1, 1, -1
538      zx1=0.
539      DO jj_sd = ji_sd+1, ninco
540         zx1 = zx1 + ztmpx(jj_sd) * ztmp3(ji_sd,jj_sd)
541      ENDDO
542      ztmpx(ji_sd) = ztmp4(ji_sd)-zx1
543   ENDDO
544
545   DO jj_sd =1, ninco
546      ztmp7(ipos1(jj_sd))=ztmpx(jj_sd)
547   ENDDO
548
549   CALL wrk_dealloc( jpincomax , ztmpx , zcol1 , zcol2 )
550   CALL wrk_dealloc( jpincomax , ipos2 , ipivot        )
551
552  END SUBROUTINE SUR_DETERMINE
553
[2956]554#else
555   !!----------------------------------------------------------------------
556   !!   Default case :   Empty module
557   !!----------------------------------------------------------------------
558   LOGICAL, PUBLIC, PARAMETER ::   lk_diaharm = .FALSE.
559CONTAINS
560   SUBROUTINE dia_harm ( kt )     ! Empty routine
561      INTEGER, INTENT( IN ) :: kt 
562      WRITE(*,*) 'dia_harm: you should not have seen this print'
563   END SUBROUTINE dia_harm
[4292]564#endif
[2956]565
566   !!======================================================================
567END MODULE diaharm
Note: See TracBrowser for help on using the repository browser.