@@ -39,6 +39,8 @@ SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM (CTYPE_CCN,XD,XSIGMA,XLIMIT_FACTOR,
39
39
USE MODI_GAMMA_INC
40
40
USE MODI_HYPGEO
41
41
USE MODI_HYPSER
42
+ USE MODD_PRECISION, ONLY: MNHREAL64
43
+ USE MODI_MINPACK
42
44
!
43
45
IMPLICIT NONE
44
46
!
@@ -55,13 +57,13 @@ SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM (CTYPE_CCN,XD,XSIGMA,XLIMIT_FACTOR,
55
57
!
56
58
! * 0.2 Declarations of local variables :
57
59
!
58
- INTEGER , PARAMETER :: M = 1000 ! Number of points (S,Nccn) used to fit the spectra
59
- INTEGER , PARAMETER :: N = 3 ! Number of parameters to adjust
60
- REAL , DIMENSION (N) :: PARAMS ! Parameters to adjust by the LM algorithm (k, mu, beta)
61
- REAL , DIMENSION (M) :: FVEC ! Array to store the distance between theoretical and fitted spectra
60
+ INTEGER (KIND = 4 ) , PARAMETER :: M = 1000 ! Number of points (S,Nccn) used to fit the spectra
61
+ INTEGER (KIND = 4 ) , PARAMETER :: N = 3 ! Number of parameters to adjust
62
+ REAL (KIND = MNHREAL64) , DIMENSION (N) :: PARAMS ! Parameters to adjust by the LM algorithm (k, mu, beta)
63
+ REAL (KIND = MNHREAL64) , DIMENSION (M) :: FVEC ! Array to store the distance between theoretical and fitted spectra
62
64
INTEGER :: IFLAG !
63
- INTEGER :: INFO !
64
- REAL :: TOL = 1.E-16 ! Fit precision required
65
+ INTEGER (KIND = 4 ) :: INFO !
66
+ REAL (KIND = MNHREAL64) :: TOL = 1.E-16 ! Fit precision required
65
67
!
66
68
INTEGER :: II, IJ ! Loop indices
67
69
!
@@ -152,8 +154,9 @@ SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM (CTYPE_CCN,XD,XSIGMA,XLIMIT_FACTOR,
152
154
! * 3. Compute C, k, mu, beta, using the Levenberg-Marquardt algorithm
153
155
! ---------------------------------------------------------------
154
156
!
155
- PARAMS(1 :3 ) = (/ 1 ., 1 ., 1000 . / )
157
+ PARAMS(1 :3 ) = (/ 1._MNHREAL64 , 1._MNHREAL64 , 1000._MNHREAL64 / )
156
158
IFLAG = 1
159
+ ! lmdif1 uses KIND 8 reals and KIND 4 integers
157
160
call lmdif1 ( DISTANCE, M, N, PARAMS, FVEC, TOL, INFO )
158
161
!
159
162
XLIMIT_FACTOR = gamma(PARAMS(2 ))* PARAMS(3 )** (PARAMS(1 )/ 2 )/ gamma(1 + PARAMS(1 )/ 2 )/ gamma(PARAMS(2 )- PARAMS(1 )/ 2 )
@@ -333,6 +336,7 @@ FUNCTION DSDD(XD,XDDRY,XKAPPA, XT) RESULT(DS)
333
336
! * 0. DECLARATIONS
334
337
!
335
338
USE MODD_CST, ONLY : XMV, XAVOGADRO, XBOLTZ, XRHOLW
339
+ USE MODD_PRECISION, ONLY: MNHREAL64
336
340
!
337
341
IMPLICIT NONE
338
342
!
@@ -348,10 +352,12 @@ FUNCTION DSDD(XD,XDDRY,XKAPPA, XT) RESULT(DS)
348
352
! * 0.2 declarations of local variables
349
353
!
350
354
REAL :: XA ! factor inside the exponential
355
+ REAL (KIND= MNHREAL64) :: Z
351
356
!
352
357
XA = 4 * 0.072 * XMV / XAVOGADRO / XBOLTZ / XT / XRHOLW
353
- DS = (XD** 3 - XDDRY** 3 ) * (XD** 3 - (1 - XKAPPA)* XDDRY** 3 ) * XA - 3 . * XKAPPA * XD** 4 * XDDRY** 3
354
- DS = DS * EXP (XA/ XD) / (XD** 3 - (1 - XKAPPA)* XDDRY** 3 )** 2
358
+ Z = (XD** 3 - XDDRY** 3 ) * (XD** 3 - (1._MNHREAL64 - XKAPPA)* XDDRY** 3 ) * XA - 3._MNHREAL64 * XKAPPA * DBLE (XD)** 4 * DBLE (XDDRY)** 3
359
+ Z = Z * EXP (XA/ XD) / (XD** 3 - (1 - XKAPPA)* XDDRY** 3 )** 2
360
+ DS = Z
355
361
!
356
362
END FUNCTION DSDD
357
363
!
@@ -396,11 +402,12 @@ SUBROUTINE DISTANCE(M,N,X,FVEC,IFLAG)
396
402
!
397
403
! * 0.1 declarations of arguments and result
398
404
!
399
- integer , intent (in ) :: M
400
- integer , intent (in ) :: N
401
- real , intent (in ) :: X(N)
402
- real , intent (out ) :: FVEC(M)
403
- integer , intent (inout ) :: IFLAG
405
+ ! DISTANCE must use KIND 8 reals and KIND 4 integers to be used by LMDIF1
406
+ integer (KIND= 4 ), intent (in ) :: M
407
+ integer (KIND= 4 ), intent (in ) :: N
408
+ real (KIND= MNHREAL64), intent (in ) :: X(N)
409
+ real (KIND= MNHREAL64), intent (out ) :: FVEC(M)
410
+ integer (KIND= 4 ), intent (inout ) :: IFLAG
404
411
!
405
412
! * 0.2 declarations of local variables
406
413
!
@@ -416,7 +423,7 @@ SUBROUTINE DISTANCE(M,N,X,FVEC,IFLAG)
416
423
DO I= 1 , M
417
424
! XS in "no units", ie XS=0.01 for a 1% suersaturation
418
425
! ZW= C * (XS(I)/100)**X(1) * HYPGEO(X(2),X(1)/2,X(1)/2+1,X(3),XS(I)/100)
419
- ZW= C * (XS(I))** X(1 ) * HYPGEO(X(2 ), X(1 )/ 2 , X(1 )/ 2+1 , X(3 ), XS(I))
426
+ ZW= C * (XS(I))** X(1 ) * HYPGEO(REAL ( X(2 )), REAL ( X(1 )/ 2 ), REAL ( X(1 )/ 2+1 ), REAL ( X(3 )), REAL ( XS(I) ))
420
427
! !$ IF (X(3)*(XS(I)/100)**2 .LT. 0.98) THEN
421
428
! !$ CALL HYPSER(X(2),X(1)/2,X(1)/2+1,-X(3)*(XS(I)/100)**2,ZW2)
422
429
! !$ print *, "args= ", X(2), X(1)/2, X(1)/2+1, -X(3)*(XS(I)/100)**2, " hypser = ", ZW2
0 commit comments