contin.for
Upload User: lian147
Upload Date: 2018-12-26
Package Size: 6532k
Code Size: 463k
Development Platform:

Fortran

  1. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0003
  2. C  CONTIN.  MAIN SUBPROGRAM.                                                0004
  3. c
  4. C  Download the Users Manual and other essential documentation from
  5. c    http://S-provencher.COM
  6. c
  7. c 06-Dec-01: 500 light scattering form factors also allowed (increased from the 
  8. c              unnecessarily small 50).
  9. C
  10. C 20-Jan-99: DIMENSION specifications increased to handle up to 8192 data 
  11. C                points and about 500 grid points.  Section 3.5 of the manual 
  12. C                explains how you can change these, if memory is limited.
  13. C              If computation time is critical and memory limited, then 
  14. C                reducing the maximum number of grid points as much as 
  15. C                possible might help a little.
  16. C              Increasing the DIMENSION specifications for more than 8192 
  17. C                data points is no problem.
  18. C              More than 500 grid points is not recommended, because of 
  19. C                possible problems with numerical stability.  
  20. C              With difficult inversions, such as Laplace transforms, NG, 
  21. C                the number of grid points, should probably not exceed 200.  
  22. C                However, NG is only an input parameter; you don't have to 
  23. C                reduce the DIMENSION specifications or make any changes to 
  24. C                the code.  
  25. C
  26. C              In each run, all the DIMENSION specifications are tested.  Thus, 
  27. C                you can simply try running, and see if CONTIN aborts with a 
  28. C                diagnostic telling you to increase a DIMENSION specification.  
  29. C                If it does not abort, then everything is OK.
  30. C
  31. C==============================================================================
  32. C              Hints for inverting noisy Laplace transforms:
  33. C              =============================================
  34. C              With Laplace inversions, you might use the following Control 
  35. C                Parameters:
  36. C                  NONNEG=T (if the solution is known to be nonnegative; without
  37. C                            this constraint the resolution is extremely poor.)
  38. C                  IUSER(10)=2
  39. C                  GMNMX(1) about 0.1/(maximum time value in your data of 
  40. C                                      signal vs. time)
  41. C                  GMNMX(2) about 4/(time-spacing between data points at the 
  42. C                                    shortest times)
  43. C                  NG about 12*log10[GMNMX(2)/GMNMX(1)]
  44. C                  IFORMY, NINTT, etc., as appropriate for your data.
  45. C
  46. C              The CHOSEN SOLUTION gives you a conservative (smooth) estimate 
  47. C                of a possible continuous distribution of exponentials.
  48. C
  49. C              The Reference Solution (the solution with the smallest ALPHA) 
  50. C                gives you the optimal analysis as a discrete sum of 
  51. C                exponentials.  The number of discrete exponentials is the 
  52. C                number of peaks.  Each amplitude is given by MOMEMT(0) for 
  53. C                the corresponding peak.  The decay rate constant is given by 
  54. C                MOMENT(1)/MOMENT(0).
  55. C
  56. C              Choose the solution with the smallest ALPHA that has the same 
  57. C                number of peaks as the CHOSEN SOLUTION.  This solution has 
  58. C                less smoothing bias (smaller ALPHA), but still has about 
  59. C                the same complexity (number of peaks) as the CHOSEN SOLUTION.
  60. C===============================================================================
  61. C
  62. C  5-Mar-94: COMMON blocks /MS1/-/MS6/ were added to simplify compilation on 
  63. C              PCs that have restricted easily useable memory.
  64. C
  65. C           With MS-DOS, you will probably have to break this file into 3 or 4 
  66. C             segments for compiling and then LINK these object files together.
  67. C             You will probably also have to drastically reduce the DIMENSION 
  68. C             specifications for the maximum number of grid points (down to 
  69. C             about 50); Section 3.5 of the manual tells you how to do this.  
  70. C
  71. C  
  72. C  FOR THE REGULARIZED SOLUTION OF LINEAR ALGEBRAIC AND                     0005
  73. C      LINEAR FREDHOLM INTEGRAL EQUATIONS OF THE FIRST KIND, WITH           0006
  74. C      OPTIONS FOR PEAK CONSTRAINTS AND LINEAR EQUALITY AND INEQUALITY      0007
  75. C      CONSTRAINTS.                                                         0008
  76. C  REFERENCES - S.W. PROVENCHER (1982) COMPUT. PHYS. COMMUN., VOL. 27,      0009
  77. C                                      PAGES 213-227, 229-242.              0010
  78. C                               (1984) CONTIN USERS MANUAL (EMBL            0011
  79. C                                      TECHNICAL REPORT DA07).              0012
  80. C
  81. C  As a new user you should notify S.W. Provencher at:        
  82. C      sp@S-provencher.COM
  83. C                                                                           0027
  84. C-----------------------------------------------------------------------    0028
  85. C  CALLS SUBPROGRAMS - BLOCK DATA, INIT, INPUT, SETGRD, USERSI,             0029
  86. C      WRITYT, USERSX, USERNQ, SETNNG, ANALYZ, SETWT                        0030
  87. C  WHICH IN TURN CALL - STORIN, READYT, ERRMES, WRITIN, USERIN,             0031
  88. C      USERGR, CQTRAP, USERTR, USEREX, RGAUSS, RANDOM, SETSCA, SEQACC,      0032
  89. C      H12, GETROW, USERK, USERLF, SETREG, USERRG, USEREQ, ELIMEQ,          0033
  90. C      LH1405, SVDRS2, QRBD, G1,G2, DIFF, DIAREG, DIAGA, SETGA1,            0034
  91. C      SETVAL, LDPETC, LDP, NNLS, CVNEQ, FISHNI, GAMLN,                     0035
  92. C      BETAIN, PLPRIN, USEROU, MOMENT, MOMOUT, RUNRES, GETPRU, GETYLY,      0036
  93. C      PGAUSS, PLRES, SETSGN, ANPEAK, UPDSGN, UPDDON, FFLAT, UPDLLS,        0037
  94. C      USERWT                                                               0038
  95. C-----------------------------------------------------------------------    0039
  96.       DOUBLE PRECISION PRECIS, RANGE                                        0040
  97.       DOUBLE PRECISION A, AA, AEQ, AINEQ, PIVOT, REG, RHSNEQ,               0041
  98.      1 S, SOLBES, SOLUTN, SSCALE, VALPCV, VALPHA, VK1Y1, WORK               0042
  99.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0043
  100.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0044
  101.       LOGICAL LBIND                                                         0045
  102. C                                                                           0046
  103. C***********************************************************************    0047
  104. C  THE INSTRUCTIONS SET OFF BY ASTERISKS DESCRIBE ALL POSSIBLE CHANGES      0048
  105. C      THAT YOU MAY HAVE TO MAKE IN THIS MAIN SUBPROGRAM.  (SEE ALSO THE    0049
  106. C      CHANGES IN THE BLOCK DATA AND USER SUBPROGRAMS.)  THESE CHANGES      0050
  107. C      IN THE MAIN SUBPROGRAM ARE ONLY NECESSARY IF YOU CHANGE MY, MA,      0051
  108. C      MG, MREG, MINEQ, MEQ, MDONE, OR MWORK IN THE DATA STATEMENT          0052
  109. C      BELOW.  IF YOU DO, THEN THE FOLLOWING DIMENSIONS MUST BE             0053
  110. C      READJUSTED AS DESCRIBED BELOW -                                      0054
  111. C                                                                           0055
  112.       COMMON /MS1/ AA
  113.       COMMON /MS2/ AINEQ
  114.       COMMON /MS3/ A
  115.       COMMON /MS4/ REG
  116.       COMMON /MS5/ AEQ
  117.       COMMON /MS6/ WORK
  118.       DIMENSION T(8192), SQRTW(8192), Y(8192), EXACT(8192), YLYFIT(8192)
  119.       DIMENSION G(503), CQUAD(503), VK1Y1(503), S(503,3), VALPHA(503),
  120.      1 VALPCV(503), SOLUTN(503), IISIGN(503), SOLBES(503),
  121.      2 AA(503,503), SSCALE(503)
  122.       DIMENSION AINEQ(501,503), RHSNEQ(501), LBIND(501)
  123.       DIMENSION A(503,503), IWORK(503)
  124.       DIMENSION REG(504,503)
  125.       DIMENSION AEQ(11,503), PIVOT(11)
  126.       DIMENSION WORK(253508)
  127.       DIMENSION LSDONE(90,3,2), VDONE(90)                                   0065
  128. C                                                                           0066
  129. C  THE ABOVE DIMENSION STATEMENTS MUST BE ADJUSTED AS FOLLOWS -             0067
  130. C                                                                           0068
  131. C     DIMENSION T(MY), SQRTW(MY), Y(MY), EXACT(MY), YLYFIT(MY)              0069
  132. C     DIMENSION G(MG), CQUAD(MG), VK1Y1(MG), S(MG,3), VALPHA(MG),           0070
  133. C    1 VALPCV(MG), SOLUTN(MG), IISIGN(MG), SOLBES(MG),                      0071
  134. C    2 AA(MG,MG), SSCALE(MG)                                                0072
  135. C     DIMENSION AINEQ(MINEQ,MG), RHSNEQ(MINEQ), LBIND(MINEQ)                0073
  136. C     DIMENSION A(MA,MG), IWORK(MA)                                         0074
  137. C     DIMENSION REG(MREG,MG)                                                0075
  138. C     DIMENSION AEQ(MEQ,MG), PIVOT(MEQ)                                     0076
  139. C     DIMENSION WORK(MWORK)                                                 0077
  140. C     DIMENSION LSDONE(MDONE,3,2), VDONE(MDONE)                             0078
  141. C***********************************************************************    0079
  142. C                                                                           0080
  143.       COMMON /DBLOCK/ PRECIS, RANGE                                         0081
  144.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0082
  145.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0083
  146.      2 SRANGE                                                               0084
  147.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0085
  148.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0086
  149.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0087
  150.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0088
  151.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0089
  152.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0090
  153.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0091
  154.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0092
  155.      2 LUSER(30)                                                            0093
  156. C                                                                           0094
  157. C***********************************************************************    0095
  158. C  YOU CAN SAVE STORAGE BY MAKING THE INTEGERS IN THE FOLLOWING DATA        0096
  159. C      STATEMENT AS SMALL AS THE SIZE OF YOUR PROBLEM WILL ALLOW.  (SEE     0097
  160. C      USERS MANUAL FOR THE MINIMUM ALLOWABLE VALUES.)                      0098
  161. C                                                                           0099
  162.       DATA MY/8192/, MA/503/, MG/503/, MREG/504/, MINEQ/501/, MEQ/11/,
  163.      1 MDONE/90/, MWORK/253508/
  164. C                                                                           0102
  165. C  IF YOU CHANGE THE ABOVE DATA STATEMENT, THEN THE DIMENSION               0103
  166. C      STATEMENTS ABOVE MUST BE READJUSTED, AS DESCRIBED ABOVE.             0104
  167. C                                                                           0105
  168. C  THIS IS THE END OF ALL POSSIBLE CHANGES THAT YOU MIGHT HAVE TO MAKE      0106
  169. C      IN THE MAIN PROGRAM,                                                 0107
  170. C      EXCEPT THAT IF YOUR SYSTEM DOES NOT AUTOMATICALLY                    0108
  171. C      OPEN INPUT AND OUTPUT FILES FOR YOU, THEN YOU MIGHT HAVE TO OPEN     0109
  172. C      THEM HERE AND GIVE THEM THE NUMBERS NIN (FOR THE INPUT) AND          0110
  173. C      NOUT (FOR THE OUTPUT), WHERE NIN AND NOUT HAVE BEEN SET IN THE       0111
  174. C      BLOCK DATA SUBPROGRAM.                                               0112
  175. C  IN ADDITION, IF YOU ARE GOING TO INPUT IUNIT.GE.0, THEN YOU MAY          0113
  176. C      HAVE TO OPEN A TEMPORARY SCRATCH FILE NUMBERED IUNIT.  DO THIS       0114
  177. C      DIRECTLY AFTER STATEMENT 100.  THIS IS NOT NECESSARY IF IUNIT        0115
  178. C      IS NEGATIVE OR IF YOUR SYSTEM OPENS FILES AUTOMATICALLY.             0116
  179. C***********************************************************************    0117
  180. C                                                                           0118
  181. C-----------------------------------------------------------------------    0119
  182. C  INITIALIZE VARIABLES                                                     0120
  183. C-----------------------------------------------------------------------    0121
  184.       CALL INIT                                                             0122
  185. C-----------------------------------------------------------------------    0123
  186. C  READ INPUT DATA                                                          0124
  187. C-----------------------------------------------------------------------    0125
  188.   100 CALL INPUT (EXACT,G,MA,MEQ,MG,MINEQ,MREG,MWORK,MY,SQRTW,T,Y)          0126
  189. C-----------------------------------------------------------------------    0127
  190. C  SET UP QUADRATURE GRID                                                   0128
  191. C-----------------------------------------------------------------------    0129
  192.       CALL SETGRD (CQUAD,G,GMNMX,IGRID,IQUAD,MG,NG,NOUT)                    0130
  193. C-----------------------------------------------------------------------    0131
  194. C  CALCULATE SIMULATED DATA                                                 0132
  195. C-----------------------------------------------------------------------    0133
  196.       IF (SIMULA) CALL USERSI (EXACT,G,MG,MY,SQRTW,T,Y)                     0134
  197. C-----------------------------------------------------------------------    0135
  198. C  WRITE OUT SIMULATED DATA                                                 0136
  199. C-----------------------------------------------------------------------    0137
  200.       IF (SIMULA) CALL WRITYT (EXACT,G,IPRINT,IUSROU,IWT,MG,NOUT,NY,        0138
  201.      1 PRY,SIMULA,SQRTW,T,Y)                                                0139
  202. C-----------------------------------------------------------------------    0140
  203. C  PUT SECOND CURVE TO BE PLOTTED WITH SOLUTION IN EXACT.                   0141
  204. C-----------------------------------------------------------------------    0142
  205.       IF (.NOT.ONLY1) CALL USERSX (EXACT,G,MG)                              0143
  206.       NINEQ=0                                                               0144
  207.       NGL=NG+NLINF                                                          0145
  208.       NGLP1=NGL+1                                                           0146
  209. C-----------------------------------------------------------------------    0147
  210. C  SET SPECIAL USER-SUPPLIED INEQUALITY CONSTRAINTS                         0148
  211. C-----------------------------------------------------------------------    0149
  212.       IF (DOUSNQ) CALL USERNQ (AINEQ,MG,MINEQ)                              0150
  213. C-----------------------------------------------------------------------    0151
  214. C  SET NG NONNEGATIVITY CONSTRAINTS AT ALL NG GRID POINTS                   0152
  215. C-----------------------------------------------------------------------    0153
  216.       IF (NONNEG) CALL SETNNG (AINEQ,MINEQ,NG,NGLP1,NINEQ,NOUT)             0154
  217.       IF (IWT.EQ.1 .OR. IWT.EQ.4) GO TO 200                                 0155
  218. C-----------------------------------------------------------------------    0156
  219. C  DO A COMPLETE PRELIMINARY UNWEIGHTED ANALYSIS TO GET A SMOOTH FIT        0157
  220. C      TO THE DATA.  THIS SMOOTH CURVE IS THEN USED TO CALCULATE THE        0158
  221. C      WEIGHTS.                                                             0159
  222. C-----------------------------------------------------------------------    0160
  223.       CALL ANALYZ (1,                                                       0161
  224.      1 A,AA,AEQ,AINEQ,CQUAD,EXACT,G,IISIGN,IWORK,LBIND,LSDONE,MA,           0162
  225.      2 MDONE,MEQ,MG,MINEQ,MREG,MWORK,MY,PIVOT,REG,RHSNEQ,S,SOLBES,          0163
  226.      3 SOLUTN,SQRTW,SSCALE,T,VALPCV,VALPHA,VDONE,VK1Y1,WORK,                0164
  227.      4 Y,YLYFIT)                                                            0165
  228. C-----------------------------------------------------------------------    0166
  229. C  CALCULATE SQRTW (SQUARE ROOT OF LEAST SQUARES WEIGHTS).                  0167
  230. C-----------------------------------------------------------------------    0168
  231.       CALL SETWT (                                                          0169
  232.      1 CQUAD,G,IUNIT,IWT,MWORK,MY,NERFIT,NG,NGL,NLINF,NOUT,NY,PRWT,         0170
  233.      2 SOLBES,SQRTW,SRANGE,SSCALE,T,WORK,Y,YLYFIT)                          0171
  234. C-----------------------------------------------------------------------    0172
  235. C  DO FINAL WEIGHTED ANALYSIS.                                              0173
  236. C-----------------------------------------------------------------------    0174
  237.   200 CALL ANALYZ (2,                                                       0175
  238.      1 A,AA,AEQ,AINEQ,CQUAD,EXACT,G,IISIGN,IWORK,LBIND,LSDONE,MA,           0176
  239.      2 MDONE,MEQ,MG,MINEQ,MREG,MWORK,MY,PIVOT,REG,RHSNEQ,S,SOLBES,          0177
  240.      3 SOLUTN,SQRTW,SSCALE,T,VALPCV,VALPHA,VDONE,VK1Y1,WORK,                0178
  241.      4 Y,YLYFIT)                                                            0179
  242.       IF (.NOT.LAST) GO TO 100                                              0180
  243.       STOP                                                                  0181
  244.       END                                                                   0182
  245. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0183
  246. C  BLOCK DATA SUBPROGRAM.                                                   0184
  247.       BLOCK DATA                                                            0185
  248.       DOUBLE PRECISION PRECIS, RANGE                                        0186
  249.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0187
  250.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0188
  251.       COMMON /DBLOCK/ PRECIS, RANGE                                         0189
  252.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0190
  253.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0191
  254.      2 SRANGE                                                               0192
  255.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0193
  256.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0194
  257.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0195
  258.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0196
  259.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0197
  260.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0198
  261.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0199
  262.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0200
  263.      2 LUSER(30)                                                            0201
  264. C                                                                           0202
  265. C***********************************************************************    0203
  266. C  YOU MUST SET THE FOLLOWING 4 VARIABLES TO VALUES APPROPRIATE FOR         0204
  267. C      YOUR COMPUTER.  (SEE USERS MANUAL.)                                  0205
  268. C     DATA RANGE/1.E35/, SRANGE/1.E35/, NIN/5/, NOUT/6/!SP                  0206
  269.       DATA RANGE/1.D35/, SRANGE/1.E35/, NIN/5/, NOUT/6/                     0207
  270. C***********************************************************************    0208
  271. C                                                                           0209
  272. C                                                                           0210
  273. C***********************************************************************    0211
  274. C  CONTIN WILL USE THE VALUES OF THE CONTROL VARIABLES THAT ARE IN THE      0212
  275. C      DATA STATEMENTS BELOW UNLESS YOU INPUT DIFFERENT VALUES.  TO SAVE    0213
  276. C      INPUTTING THESE OFTEN, YOU CAN CHANGE THE VALUES BELOW TO THOSE      0214
  277. C      THAT YOU WILL USUALLY USE.                                           0215
  278. C  THE FOLLOWING DATA STATEMENTS CONTAIN (IN ALPHABETICAL ORDER) THE        0216
  279. C      REAL, INTEGER, AND LOGICAL CONTROL VARIABLES, IN THAT ORDER.         0217
  280.       DATA ALPST/2*0./, DFMIN/2./, GMNMX/2*0./, PLEVEL/4*.5/,               0218
  281.      1 RSVMNX/2*1., 2*0./, RUSER/551*0./,                                   0219
  282.      2 SRMIN/.01/                                                           0220
  283.       DATA ICRIT/2*1/,                                                      0221
  284.      1 IFORMT/1H(, 1H5, 1HE, 1H1, 1H5, 1H., 1H6, 1H), 62*1H /,              0222
  285.      2 IFORMW/1H(, 1H5, 1HE, 1H1, 1H5, 1H., 1H6, 1H), 62*1H /,              0223
  286.      3 IFORMY/1H(, 1H5, 1HE, 1H1, 1H5, 1H., 1H6, 1H), 62*1H /,              0224
  287.      4 IGRID/2/, IPLFIT/2*2/, IPLRES/2*2/, IPRINT/2*4/, IQUAD/3/,           0225
  288.      5 IUNIT/-1/, IUSER/9*0, 2, 7*0, 50, 32*0/, IUSROU/2*0/, IWT/1/,        0226
  289.      6 LINEPG/60/, LSIGN/16*0/, MIOERR/5/, MOMNMX/-1, 3/, MPKMOM/5/,        0227
  290.      7 MQPITR/35/, NENDZ/2, 2/, NEQ/0/, NERFIT/10/, NFLAT/8*0/, NG/31/,     0228
  291.      8 NINTT/1/, NLINF/0/, NNSGN/2*0/, NORDER/2/, NQPROG/6, 6/,             0229
  292.      9 NSGN/4*0/                                                            0230
  293.       DATA DOCHOS/.TRUE./, DOMOM/.TRUE./, DOUSIN/.TRUE./,                   0231
  294.      1 DOUSNQ/.FALSE./, LAST/.TRUE./,                                       0232
  295.      2 LUSER/30*.FALSE./, NEWPG1/.FALSE./, NONNEG/.TRUE./,                  0233
  296.      3 ONLY1/.TRUE./, PRWT/.TRUE./, PRY/.TRUE./,                            0234
  297.      4 SIMULA/.FALSE./                                                      0235
  298. C***********************************************************************    0236
  299. C                                                                           0237
  300. C                                                                           0238
  301. C***********************************************************************    0239
  302. C  IF YOU MAKE ANY CHANGES TO CONTIN, YOU SHOULD PUT A NAME (UP TO 6        0240
  303. C      CHARACTERS) IN IAPACK TO UNIQUELY IDENTIFY YOUR VERSION OF           0241
  304. C      CONTIN.  THIS WILL BE PRINTED IN THE HEADING OF VARIOUS PARTS OF     0242
  305. C      THE OUTPUT.  YOU MUST SPECIFY THE NAME IN THE FOLLOWING STATEMENT    0243
  306.       DATA IAPACK/1H ,1HP, 1HC, 1HS, 1H-, 1H1/                              0244
  307. C***********************************************************************    0245
  308. C                                                                           0246
  309.       END                                                                   0247
  310. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0248
  311. C  SUBROUTINE USEREQ.  THIS IS A USER-SUPPLIED ROUTINE (NEEDED              0249
  312. C      WHEN NEQ IS INPUT POSITIVE) TO PUT THE EQUALITY-CONSTRAINT           0250
  313. C      MATRIX IN THE FIRST NEQ ROWS AND NGL COLUMNS OF AEQ, AND             0251
  314. C      THE RIGHT-HAND-SIDE OF THE EQUALITIES IN COLUMN NGLP1=NGL+1.         0252
  315. C  CQUAD CONTAINS THE COEFFICIENTS OF THE QUADRATURE FORMULA THAT WERE      0253
  316. C      SET IN SETGRD.                                                       0254
  317. C  NOTE - IF WEIGHTS ARE TO BE CALCULATED (I.E., IF IWT=2,3, OR 5), THEN    0255
  318. C      USEREQ WILL BE CALLED TWICE.  THEREFORE IT IS BEST TO HAVE ANY       0256
  319. C      DATA NEEDED BY USEREQ READ IN ONLY ONCE AND STORED, E.G., IN         0257
  320. C      RUSER, AS ILLUSTRATED BELOW.                                         0258
  321. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       0259
  322. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     0260
  323. C  BELOW IS ILLUSTRATED THE CASE WHERE THE END POINTS AND THE               0261
  324. C      INTEGRAL OVER THE SOLUTION CAN BE CONSTRAINED -                      0262
  325. C      IF NEQ=1, THEN THE SOLUTION IS CONSTRAINED TO BE RUSER(1) AT         0263
  326. C        THE GRID POINT NG (THE LAST POINT).                                0264
  327. C      IF NEQ=2, THEN, IN ADDITION, THE SOLUTION IS CONSTRAINED TO          0265
  328. C        RUSER(2) AT GRID POINT 1                                           0266
  329. C      IF NEQ=3, THEN, IN ADDITION, THE INTEGRAL OVER THE SOLUTION          0267
  330. C      (USING THE QUADRATURE APPROXIMATION) IS CONSTRAINED TO BE            0268
  331. C      RUSER(6).  NEQ = 1, 2 OR 3 AND RUSER(J), J=1, (AND 2 AND 6           0269
  332. C      IF NEQ=2 OR 3) WOULD HAVE TO HAVE BEEN PREVIOUSLY INPUT.             0270
  333.       SUBROUTINE USEREQ (AEQ,CQUAD,MEQ,MG)                                  0271
  334.       DOUBLE PRECISION PRECIS, RANGE                                        0272
  335.       DOUBLE PRECISION AEQ                                                  0273
  336.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0274
  337.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0275
  338.       DIMENSION AEQ(MEQ,MG), CQUAD(MG)                                      0276
  339.       COMMON /DBLOCK/ PRECIS, RANGE                                         0277
  340.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0278
  341.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0279
  342.      2 SRANGE                                                               0280
  343.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0281
  344.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0282
  345.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0283
  346.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0284
  347.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0285
  348.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0286
  349.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0287
  350.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0288
  351.      2 LUSER(30)                                                            0289
  352. C     ZERO=0.E0!SP                                                          0290
  353.       ZERO=0.D0                                                             0291
  354. C     ONE=1.E0!SP                                                           0292
  355.       ONE=1.D0                                                              0293
  356. C-----------------------------------------------------------------------    0294
  357. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         0295
  358. C      FOR YOUR APPLICATION.                                                0296
  359. C-----------------------------------------------------------------------    0297
  360.       IF (NEQ.GE.1 .AND. NEQ.LE.3) GO TO 105                                0298
  361.  5105 FORMAT (/6H NEQ =,I3,28H IS NOT 1, 2 OR 3 IN USEREQ.)                 0299
  362.       WRITE (NOUT,5105) NEQ                                                 0300
  363.       STOP                                                                  0301
  364.   105 L=MIN0(NEQ,2)                                                         0302
  365.       DO 110 J=1,L                                                          0303
  366.         DO 120 K=1,NGL                                                      0304
  367.           AEQ(J,K)=ZERO                                                     0305
  368.   120   CONTINUE                                                            0306
  369.         AEQ(J,NGLP1)=RUSER(J)                                               0307
  370.   110 CONTINUE                                                              0308
  371.       AEQ(1,NG)=ONE                                                         0309
  372.       IF (NEQ .GT. 1) AEQ(2,1)=ONE                                          0310
  373.       IF (NEQ .NE. 3) GO TO 800                                             0311
  374.       DO 130 K=1,NGL                                                        0312
  375.         AEQ(3,K)=ZERO                                                       0313
  376.         IF (K .LE. NG) AEQ(3,K)=CQUAD(K)                                    0314
  377.   130 CONTINUE                                                              0315
  378.       AEQ(3,NGLP1)=RUSER(6)                                                 0316
  379.   800 RETURN                                                                0317
  380.       END                                                                   0318
  381. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0319
  382. C  FUNCTION USEREX.  THIS IS A USER-SUPPLIED FUNCTION (ONLY USED            0320
  383. C      IF SIMULA=.TRUE.) TO EVALUATE THE NOISE-FREE VALUE OF THE            0321
  384. C      SIMULATED DATA AT T(IROW) (THE INDEPENDENT VARIABLE AT THE           0322
  385. C      DATA POINT IROW).                                                    0323
  386. C  BELOW IS ILLUSTRATED THE CASE OF THE SOLUTION BEING COMPOSED OF          0324
  387. C        A SUM OF IUSER(11) DIRAC DELTA FUNCTIONS LOCATED AT                0325
  388. C        RUSER(25), RUSER(27), ... , RUSER(23+2*IUSER(11))                  0326
  389. C        WITH RESPECTIVE AMPLITUDES                                         0327
  390. C        RUSER(26), RUSER(28), ... , RUSER(24+2*IUSER(11)).                 0328
  391. C      IN ADDITION, THE NLINF FUNCTIONS IN USERLF ARE ADDED WITH            0329
  392. C        RESPECTIVE AMPLITUDES                                              0330
  393. C        RUSER(41), RUSER(42), ... , RUSER(40+NLINF).                       0331
  394. C      IUSER(11) AND NLINF CANNOT BOTH BE LESS THAN ONE.                    0332
  395. C      IUSER(11) CANNOT EXCEED 7.                                           0333
  396. C      NLINF CANNOT EXCEED 10.                                              0334
  397. C      WHEN IWT=5, THE NORMALIZATION CONSTANT, RUSER(14), IS COMPUTED       0335
  398. C        FOR THE SPECIAL CASE OF PHOTON CORRELATION SPECTROSCOPY SO THAT    0336
  399. C        GAMMA = RUSER(26)+RUSER(28)+...+RUSER(24+2*IUSER(11)), WHERE       0337
  400. C        GAMMA IS GIVEN IN EQ.(6) IN MAKROMOL. CHEM., VOL. 180, P. 201      0338
  401. C        (1979).                                                            0339
  402. C-----------------------------------------------------------------------    0340
  403. C  CALLS SUBPROGRAMS - USERLF, USERK, ERRMES                                0341
  404. C  WHICH IN TURN CALL - USERTR                                              0342
  405. C-----------------------------------------------------------------------    0343
  406.       FUNCTION USEREX (IROW,T,MY,G,MG)                                      0344
  407.       DOUBLE PRECISION PRECIS, RANGE                                        0345
  408.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0346
  409.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0347
  410.       DIMENSION T(MY), IHOLER(6), ADUM(1), G(MG)                            0348
  411.       COMMON /DBLOCK/ PRECIS, RANGE                                         0349
  412.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0350
  413.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0351
  414.      2 SRANGE                                                               0352
  415.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0353
  416.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0354
  417.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0355
  418.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0356
  419.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0357
  420.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0358
  421.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0359
  422.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0360
  423.      2 LUSER(30)                                                            0361
  424.        DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HE, 1HX/                            0362
  425. C-----------------------------------------------------------------------    0363
  426. C  THE FOLLOWING STATEMENTS SHOULD BE REPLACED WITH THE ONES                0364
  427. C      APPROPRIATE FOR YOUR SIMULATION.                                     0365
  428. C-----------------------------------------------------------------------    0366
  429.       IF (NLINF.GT.10 .OR. IUSER(11).GT.8 .OR.                              0367
  430.      1 MAX0(NLINF,IUSER(11)).LE.0) CALL ERRMES (1,.TRUE.,IHOLER,NOUT)       0368
  431.       USEREX=0.                                                             0369
  432.       IF (NLINF .LE. 0) GO TO 150                                           0370
  433.       DO 110 J=1,NLINF                                                      0371
  434.         JJ=J                                                                0372
  435.         IF (ABS(RUSER(J+40)) .GT. 0.) USEREX=USEREX+RUSER(J+40)*            0373
  436.      1  USERLF(IROW,JJ,T,MY)                                                0374
  437.   110 CONTINUE                                                              0375
  438.   150 IF (IUSER(11) .LE. 0) GO TO 800                                       0376
  439.       JJ=IUSER(11)                                                          0377
  440.       IF (IROW .GT. 1) GO TO 158                                            0378
  441.       RUSER(14)=1.                                                          0379
  442.       IF (IWT .NE. 5) GO TO 158                                             0380
  443.       RUSER(14)=0.                                                          0381
  444.       AMPSUM=0.                                                             0382
  445.       DO 155 J=1,JJ                                                         0383
  446.         AMPSUM=AMPSUM+RUSER(2*J+24)                                         0384
  447.         ADUM(1)=0.                                                          0385
  448.         G(NG+1)=RUSER(2*J+23)                                               0386
  449.         RUSER(14)=RUSER(14)+RUSER(2*J+24)*USERK(1,ADUM,NG+1,G)              0387
  450.   155 CONTINUE                                                              0388
  451.       IF (RUSER(14) .LE. 0.) CALL ERRMES (2,.TRUE.,IHOLER,NOUT)             0389
  452.       RUSER(14)=AMPSUM/RUSER(14)                                            0390
  453.   158 DO 160 J=1,JJ                                                         0391
  454.         G(NG+1)=RUSER(2*J+23)                                               0392
  455.         USEREX=USEREX+RUSER(2*J+24)*USERK(IROW,T,NG+1,G)*RUSER(14)          0393
  456.   160 CONTINUE                                                              0394
  457.   800 RETURN                                                                0395
  458.       END                                                                   0396
  459. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0397
  460. C  SUBROUTINE USERGR.  THIS IS A USER-SUPPLIED ROUTINE (ONLY CALLED         0398
  461. C      WHEN IGRID IS INPUT AS 3) FOR COMPUTING A NONSTANDARD GRID G         0399
  462. C      AND THE QUADRATURE WEIGHTS CQUAD.                                    0400
  463. C  IN THE EXAMPLE BELOW, G IS SIMPLY READ IN.  CQUAD IS                     0401
  464. C      THEN COMPUTED FOR THE TRAPEZOIDAL RULE.                              0402
  465. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       0403
  466. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     0404
  467. C-----------------------------------------------------------------------    0405
  468. C  CALLS SUBPROGRAMS - CQTRAP                                               0406
  469. C-----------------------------------------------------------------------    0407
  470.       SUBROUTINE USERGR (G,CQUAD,MG)                                        0408
  471.       DOUBLE PRECISION PRECIS, RANGE                                        0409
  472.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0410
  473.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0411
  474.       DIMENSION G(MG), CQUAD(MG)                                            0412
  475.       COMMON /DBLOCK/ PRECIS, RANGE                                         0413
  476.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0414
  477.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0415
  478.      2 SRANGE                                                               0416
  479.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0417
  480.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0418
  481.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0419
  482.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0420
  483.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0421
  484.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0422
  485.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0423
  486.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0424
  487.      2 LUSER(30)                                                            0425
  488. C-----------------------------------------------------------------------    0426
  489. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         0427
  490. C      FOR YOUR APPLICATION.                                                0428
  491. C-----------------------------------------------------------------------    0429
  492.       READ (NIN,5100) (G(J),J=1,NG)                                         0430
  493.  5100 FORMAT (5E15.6)                                                       0431
  494. C-----------------------------------------------------------------------    0432
  495. C  CQTRAP USES G TO PUT TRAPEZOIDAL RULE WEIGHTS IN CQUAD.                  0433
  496. C-----------------------------------------------------------------------    0434
  497.       CALL CQTRAP (G,CQUAD,NG)                                              0435
  498.       RETURN                                                                0436
  499.       END                                                                   0437
  500. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0438
  501. C  SUBROUTINE USERIN.  THIS IS A USER-SUPPLIED ROUTINE (ONLY CALLED         0439
  502. C      WHEN DOUSIN=.TRUE.) THAT IS CALLED RIGHT AFTER THE INITIALIZATION    0440
  503. C      AND INPUT OF THE COMMON VARIABLES, T, Y, AND THE LEAST-SQUARES       0441
  504. C      WEIGHTS.  THEREFORE, IT CAN BE USED TO MODIFY ANY OF THESE.          0442
  505. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       0443
  506. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     0444
  507. C  BELOW IS ILLUSTRATED TWO PREPARATION OF INPUT DATA FOR KERNELS OF        0445
  508. C      THE GENERAL FORM -                                                   0446
  509. C                                                                           0447
  510. C      USERK(T,G)=FORMF2(G)*G**RUSER(23)*EXP(-RUSER(21)*T*G**RUSER(22))     0448
  511. C                                                                           0449
  512. C  WHERE RUSER(21) AND RUSER(22) ARE NOT ZERO.  THIS INCLUDES               0450
  513. C      LAPLACE TRANSFORMS AND MANY APPLICATIONS IN PHOTON CORRELATION       0451
  514. C      SPECTROSCOPY AS SPECIAL CASES.                                       0452
  515. C                                                                           0453
  516. C  THE FOLLOWING ARE USED INTERNALLY BY USERIN AND USERK,                   0454
  517. C      AND CANNOT BE USED BY YOU FOR ANY OTHER PURPOSES -                   0455
  518. C      IUSER(10), IUSER(18), LUSER(3), LUSER(4),                            0456
  519. C      RUSER(J), J = 10,15,...,50+NG (AND THEREFORE NG                      0457
  520. C      CANNOT EXCEED 50).                                                   0458
  521. C                                                                           0459
  522. C  THE FOLLOWING ARE THE NECESSARY INPUT -                                  0460
  523. C                                                                           0461
  524. C  DOUSIN = T (DOUSIN MUST ALWAYS BE .TRUE..)                               0462
  525. C                                                                           0463
  526. C  LUSER(3) = T, TO HAVE FORMF2, THE SQUARED FORM FACTORS, COMPUTED IN      0464
  527. C                USERK.                                                     0465
  528. C           = F, TO SET ALL THE FORMF2 TO 1. (AS WOULD BE APPROPRIATE       0466
  529. C                WITH LAPLACE TRANSFORMS).                                  0467
  530. C  RUSER(24) MAY BE NECESSARY INPUT TO SPECIFY THE FORM FACTOR (E.G.,       0468
  531. C            THE WALL THICKNESS OF A HOLLOW SPHERE) IF LUSER(3)=T.  SEE     0469
  532. C            COMMENTS IN USERK.                                             0470
  533. C  IUSER(18) MAY BE NECESSARY INPUT IF LUSER(3)=T (E.G., TO SPECIFY THE     0471
  534. C            NUMBER OF POINTS OVER WHICH THE SQUARED FORM FACTORS WILL      0472
  535. C            BE AVERAGED). SEE COMMENTS IN USERK.                           0473
  536. C                                                                           0474
  537. C  RUSER(16) = WAVELENGTH OF INCIDENT LIGHT (IN NANOMETERS),                0475
  538. C            = 0, IF RUSER(20), THE MAGNITUDE OF THE SCATTERING VECTOR      0476
  539. C                 (IN CM**-1), IS NOT TO BE COMPUTED.  WHEN                 0477
  540. C                 RUSER(16)=0, RUSER(15) AND RUSER(17) NEED NOT BE          0478
  541. C                 INPUT, AND CONTIN WILL SET RUSER(21)=1                    0479
  542. C                 (AS APPROPRIATE WITH LAPLACE TRANSFORMS).                 0480
  543. C                                                                           0481
  544. C  RUSER(15) = REFRACTIVE INDEX.                                            0482
  545. C  RUSER(17) = SCATTERING ANGLE (IN DEGREES).                               0483
  546. C                                                                           0484
  547. C                                                                           0485
  548. C  IUSER(10) SELECTS SPECIAL CASES OF USERK FOR MORE CONVENIENT USE.        0486
  549. C                                                                           0487
  550. C  IUSER(10) = 1, FOR MOLECULAR WEIGHT DISTRIBUTIONS FROM PCS               0488
  551. C                 (WHERE THE SOLUTION, S(G), IS SUCH THAT S(G)DG IS         0489
  552. C                 THE WEIGHT FRACTION WITH MOLECULAR WEIGHT BETWEEN         0490
  553. C                 G AND G+DG).                                              0491
  554. C                 CONTIN SETS -                                             0492
  555. C                   RUSER(23) = 1.,                                         0493
  556. C                   RUSER(21) = RUSER(18)*RUSER(20)**2.                     0494
  557. C                               (SEE ABOVE DISCUSSION OF RUSER(16).)        0495
  558. C                 YOU MUST INPUT -                                          0496
  559. C                   RUSER(18) TO SATISFY THE EQUATION (IN CGS UNITS) -      0497
  560. C                   (DIFFUSION COEFF.)=RUSER(18)*(MOL. WT.)**RUSER(22).     0498
  561. C                   RUSER(22) (MUST ALSO BE INPUT, TYPICALLY ABOUT -.5).    0499
  562. C                                                                           0500
  563. C  IUSER(10) = 2, FOR DIFFUSION-COEFFICIENT DISTRIBUTONS OR LAPLACE         0501
  564. C                 TRANSFORMS (WHERE G IS DIFF. COEFF. IN CM**2/SEC          0502
  565. C                 OR, E.G., TIME CONSTANT).                                 0503
  566. C                 CONTIN SETS -                                             0504
  567. C                   RUSER(23) = 0.,                                         0505
  568. C                   RUSER(22) = 1.,                                         0506
  569. C                   RUSER(21) = RUSER(20)**2 (SEE ABOVE DISCUSSION          0507
  570. C                                             OF RUSER(16).).               0508
  571. C                                                                           0509
  572. C  IUSER(10) = 3, FOR SPHERICAL-RADIUS DISTRIBUTIONS, ASSUMING THE          0510
  573. C                 EINSTEIN-STOKES RELATION (WHERE THE SOLUTION, S(G),       0511
  574. C                 IS SUCH THAT S(G)DG IS THE WEIGHT FRACTION OF             0512
  575. C                 PARTICLES WITH RADIUS (IN CM) BETWEEN G AND G+DG.         0513
  576. C                 WEIGHT-FRACTION DISTRIBUTIONS YIELD BETTER SCALED         0514
  577. C                 PROBLEMS THAN NUMBER-FRACTION DISTRIBUTIONS, WHICH        0515
  578. C                 WOULD REQUIRE RUSER(23)=6.)                               0516
  579. C                 CONTIN SETS -                                             0517
  580. C                   RUSER(23) = 3.,                                         0518
  581. C                   RUSER(22) = -1.,                                        0519
  582. C                   RUSER(21) = RUSER(20)**2*(BOLTZMANN CONST.)*            0520
  583. C                               RUSER(18)/(.06*PI*RUSER(19)).               0521
  584. C                               (SEE ABOVE DISCUSSION OF RUSER(16).)        0522
  585. C                 YOU MUST HAVE INPUT -                                     0523
  586. C                   RUSER(18) = TEMPERATURE (IN DEGREES KELVIN),            0524
  587. C                   RUSER(19) = VISCOSITY (IN CENTIPOISE).                  0525
  588. C                                                                           0526
  589. C  IUSER(10) = 4, FOR GENERAL CASE, WHERE YOU MUST HAVE INPUT -             0527
  590. C                 RUSER(J), J = 21, 22, 23.                                 0528
  591. C                                                                           0529
  592. C                                                                           0530
  593. C  RUSER(J) FOR J = 18, 19, 21, 22, 23 -  SEE THE ABOVE INSTRUCTIONS        0531
  594. C                                         FOR THE VALUE OF IUSER(10)        0532
  595. C                                         THAT YOU ARE USING.               0533
  596. C                                                                           0534
  597. C                                                                           0535
  598. C  RUSER(10) SPECIFIES HOW THE INPUT Y VALUES WILL BE CONVERTED (E.G.,      0536
  599. C            TO THE NORMALIZED FIRST-ORDER CORRELATION FUNCTION).           0537
  600. C  RUSER(10) = 0., FOR NO CONVERSION (I.E., IF THE INPUT Y VALUES           0538
  601. C                  ARE ALREADY IN THE REQUIRED FORM, AS WITH                0539
  602. C                  LAPLACE TRANSFORMS).                                     0540
  603. C  RUSER(10) NEGATIVE, WHEN THE INPUT Y ARE NORMALIZED 2ND-ORDER            0541
  604. C                      CORRELATION FUNCTIONS MINUS 1 (AS WITH TEST          0542
  605. C                      DATA SET 1) THIS CAUSES -                            0543
  606. C                      Y=SIGN(SQRT(ABS(Y)),Y).                              0544
  607. C                      (SEE THE USERS MANUAL FOR AN                         0545
  608. C                      EXPLANATION OF WHY SIGN() IS USED.)                  0546
  609. C  RUSER(10) POSITIVE, WHEN THE INPUT Y ARE 2ND-ORDER CORRELATION           0547
  610. C                      FUNCTIONS.  RUSER(10) = THE BACKGROUND TERM          0548
  611. C                      (E.G., RUSER(10)=1 WHEN THE INPUT Y ARE              0549
  612. C                      NORMALIZED 2ND-ORDER CORREL. FCTNS.).  THIS          0550
  613. C                      CAUSES -                                             0551
  614. C                        Y=SIGN(SQRT(ABS(X)),X), WHERE                      0552
  615. C                        X=Y/RUSER(10)-1.                                   0553
  616. C                                                                           0554
  617. C-----------------------------------------------------------------------    0555
  618. C  CALLS SUBPROGRAMS - ERRMES                                               0556
  619. C-----------------------------------------------------------------------    0557
  620.       SUBROUTINE USERIN (T,Y,SQRTW,MY)                                      0558
  621.       DOUBLE PRECISION PRECIS, RANGE                                        0559
  622.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0560
  623.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0561
  624.       DIMENSION T(MY), Y(MY), SQRTW(MY)                                     0562
  625.       DIMENSION IHOLER(6)                                                   0563
  626.       COMMON /DBLOCK/ PRECIS, RANGE                                         0564
  627.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0565
  628.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0566
  629.      2 SRANGE                                                               0567
  630.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0568
  631.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0569
  632.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0570
  633.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0571
  634.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0572
  635.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0573
  636.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0574
  637.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0575
  638.      2 LUSER(30)                                                            0576
  639.       DATA IHOLER /1HU, 1HS, 1HE, 1HR, 1HI, 1HN/                            0577
  640. C-----------------------------------------------------------------------    0578
  641. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         0579
  642. C      FOR YOUR APPLICATION.                                                0580
  643. C-----------------------------------------------------------------------    0581
  644. C  INITIALIZE FLAG FOR CALCULATION OF FORM FACTORS IN USERK.                0582
  645. C-----------------------------------------------------------------------    0583
  646.       LUSER(4)=.FALSE.                                                      0584
  647.       IF (IUSER(10).LT.1 .OR. IUSER(10).GT.4) CALL ERRMES (1,.TRUE.,        0585
  648.      1 IHOLER,NOUT)                                                         0586
  649.       IF (ABS(RUSER(10)).LE.0. .OR. SIMULA) GO TO 120                       0587
  650. C-----------------------------------------------------------------------    0588
  651. C  TRANSFORM INPUT Y VALUES TO NORMALIZED FIRST-ORDER CORRELATION FCTNS.    0589
  652. C-----------------------------------------------------------------------    0590
  653.       DO 110 J=1,NY                                                         0591
  654.         DUM=Y(J)                                                            0592
  655.         IF (RUSER(10) .GT. 0.) DUM=DUM/RUSER(10)-1.                         0593
  656.         Y(J)=SIGN(SQRT(ABS(DUM)),DUM)                                       0594
  657.   110 CONTINUE                                                              0595
  658.   120 IF (IUSER(10) .EQ. 2) RUSER(22)=1.                                    0596
  659.       IF (IUSER(10) .EQ. 3) RUSER(22)=-1.                                   0597
  660. C-----------------------------------------------------------------------    0598
  661. C  COMPUTE THE CONSTANTS RUSER(J), J=20,21 FOR USE IN USERK.                0599
  662. C-----------------------------------------------------------------------    0600
  663.       IF (IUSER(10) .NE. 4) RUSER(21)=1.                                    0601
  664.       IF (RUSER(16) .LE. 0.) GO TO 800                                      0602
  665. C-----------------------------------------------------------------------    0603
  666. C  1.256...E8 = 4.E7*PI     8.726...E-3 = .5 RADIAN/DEGREE                  0604
  667. C-----------------------------------------------------------------------    0605
  668.       RUSER(20)=1.256637E8*RUSER(15)*SIN(8.726646E-3*RUSER(17))/            0606
  669.      1 RUSER(16)                                                            0607
  670.       IF (IUSER(10) .EQ. 4) GO TO 800                                       0608
  671.       RUSER(21)=RUSER(20)**2                                                0609
  672.       IF (IUSER(10) .EQ. 1) RUSER(21)=RUSER(21)*RUSER(18)                   0610
  673.       IF (IUSER(10) .NE. 3) GO TO 800                                       0611
  674.       IF (RUSER(19) .LE. 0.) CALL ERRMES (2,.TRUE.,IHOLER,NOUT)             0612
  675. C-----------------------------------------------------------------------    0613
  676. C  7.323...E-16 = (BOLTZMANN CONSTANT)/(.06*PI)                             0614
  677. C-----------------------------------------------------------------------    0615
  678.       RUSER(21)=RUSER(21)*7.323642E-16*RUSER(18)/RUSER(19)                  0616
  679.   800 RETURN                                                                0617
  680.       END                                                                   0618
  681. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0619
  682. C  FUNCTION USERK.  THIS IS A USER-SUPPLIED ROUTINE (ALWAYS NEEDED)         0620
  683. C      TO COMPUTE THE FREDHOLM KERNEL, USERK, WHICH DEPENDS ON T(JT)        0621
  684. C      (THE INDEPENDENT VARIABLE AT DATA POINT JT) AND G(JG) (THE           0622
  685. C      VALUE OF THE JG TH GRID POINT.                                       0623
  686. C  BELOW IS ILLUSTRATED THE CASE OF A GENERAL TYPE OF KERNEL                0624
  687. C      APPLICABLE TO PHOTON CORRELATION SPECTROSCOPY AND LAPLACE            0625
  688. C      TRANSFORMS -                                                         0626
  689. C                                                                           0627
  690. C      USERK(T,G)=FORMF2(G)*G**RUSER(23)*EXP(-RUSER(21)*T*G**RUSER(22))     0628
  691. C                                                                           0629
  692. C      SEE COMMENTS IN USERIN.                                              0630
  693. C  THE MEAN SQUARED FORM FACTOR, FORMF2(G), COMPUTED BELOW IS FOR THE       0631
  694. C      RAYLEIGH-DEBYE APPROXIMATION FOR HOLLOW SPHERES.                     0632
  695. C      SEE COMMENTS BELOW                                                   0633
  696. C      ON HOW YOU CAN MODIFY THIS FOR ANOTHER FORM FACTOR.                  0634
  697. C  RUSER(24) = THICKNESS OF THE WALLS OF THE HOLLOW SPHERES (IN CM).        0635
  698. C            = 0 FOR FULL SPHERE (I.E., FOR WALL THICKNESS = RADIUS OF      0636
  699. C                SPHERE.                                                    0637
  700. C  IUSER(18) DETERMINES THE NUMBER OF POINTS OVER WHICH THE FORM            0638
  701. C      FACTOR WILL BE AVERAGED, AS EXPLAINED IN THE COMMENTS BELOW.         0639
  702. C-----------------------------------------------------------------------    0640
  703. C  CALLS SUBPROGRAMS - ERRMES, USERTR                                       0641
  704. C-----------------------------------------------------------------------    0642
  705.       FUNCTION USERK (JT,T,JG,G)                                            0643
  706.       DOUBLE PRECISION PRECIS, RANGE                                        0644
  707.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0645
  708.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0646
  709.       DIMENSION T(JT), G(*)                                                 0647
  710.       DIMENSION IHOLER(6)                                                   0648
  711.       COMMON /DBLOCK/ PRECIS, RANGE                                         0649
  712.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0650
  713.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0651
  714.      2 SRANGE                                                               0652
  715.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0653
  716.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0654
  717.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0655
  718.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0656
  719.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0657
  720.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0658
  721.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0659
  722.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0660
  723.      2 LUSER(30)                                                            0661
  724.       DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HK, 1H /                             0662
  725.       IF (JT.GT.NY .OR. JG.GT.NG+1 .OR. MIN0(JT,JG).LE.0) CALL              0663
  726.      1 ERRMES (1,.TRUE.,IHOLER,NOUT)                                        0664
  727. C-----------------------------------------------------------------------    0665
  728. C  THE FOLLOWING STATEMENTS SHOULD BE REPLACED BY THOSE                     0666
  729. C      APPROPRIATE FOR YOUR KERNEL.                                         0667
  730. C  FOR EXAMPLE, FOR THE LAPLACE INTEGRAL EQUATION, YOU WOULD                0668
  731. C      SIMPLY REPLACE ALL BUT THE LAST TWO STATEMENTS BELOW BY -            0669
  732. C     USERK=EXP(-T(JT)*G(JG))                                               0670
  733. C  IT MAY NOT BE NECESSARY TO GUARD AGAINST UNDERFLOW IN EXP AS IS          0671
  734. C      DONE BELOW, BUT A FEW COMPILERS ABORT AT UNDERFLOW IN EXP.           0672
  735. C      (EXMAX IS SET IN INIT TO ALOG(SRANGE), I.E., IT IS THE               0673
  736. C      LARGEST REASONABLE EXPONENT IN EXP.)                                 0674
  737. C-----------------------------------------------------------------------    0675
  738.       IF (LUSER(4)) GO TO 150                                               0676
  739.       LUSER(4)=.TRUE.                                                       0677
  740.       IF (.NOT.LUSER(3)) GO TO 150
  741. C-----------------------------------------------------------------------    0678
  742. C  PUT MEAN SQUARED FORM FACTORS IN RUSER(J), J=51,...,50+NG.               0679
  743. C  IF THE FORM FACTORS OSCILLATE SO RAPIDLY THAT THERE ARE OSCILLATIONS     0680
  744. C      WITH PERIOD LESS THAN 3 OR 4 GRID POINTS, THEN YOU SHOULD USE THE    0681
  745. C      MEAN SQUARED VALUE OVER AN INTERVAL CENTERED AT EACH GRID POINT      0682
  746. C      AND EXTENDING HALFWAY TOWARD EACH OF ITS NEIGHBORS.                  0683
  747. C  IUSER(18) = THE NUMBER OF POINTS ON EACH SIDE OF THE GRID POINT          0684
  748. C      OVER WHICH THE AVERAGE WILL BE TAKEN.  I.E., THERE WILL BE A         0685
  749. C      TOTAL OF 2*IUSER(18)+1 POINTS IN THE AVERAGE.                        0686
  750. C  IUSER(18) = 0 FOR NO AVERAGING.  I.E., THE FORM FACTOR AT THE GRID       0687
  751. C      POINT WILL BE USED.                                                  0688
  752. C  IUSER(18) = 50 IS USUALLY ADEQUATE.                                      0689
  753. C  NOTE THAT, IF IGRID=2 AS USUAL, THEN THE POINTS (AS WITH THE GRID)       0690
  754. C      WILL BE TAKEN IN EQUAL INTERVALS OF H(G) IN USERTR (E.G.,            0691
  755. C      USUALLY IN EQUAL INTERVALS OF LOG(G)).                               0692
  756. C  LUSER(3) = T WILL USE THE RAYLEIGH-DEBYE APPROXIMATION FOR               0693
  757. C               HOLLOW SPHERES FILLED WITH SOLVENT,                         0694
  758. C           = F WILL SET ALL FORM FACTORS TO 1.  THIS ALSO HAPPENS IF       0695
  759. C               RUSER(16).LE.0 (SINCE NO SCATTERING VECTOR WAS PUT IN       0696
  760. C               RUSER(20)).                                                 0697
  761. C  RUSER(24) = THICKNESS OF THE WALLS OF THE HOLLOW SPHERES (IN CM).        0698
  762. C            = 0 FOR FULL SPHERE (I.E., FOR WALL THICKNESS = RADIUS OF      0699
  763. C                SPHERE.                                                    0700
  764. C  YOU CAN CHANGE THE COMPUTATION OF RUSER BELOW TO COMPUTE THE MEAN        0701
  765. C      SQUARED FORM FACTORS THAT ARE APPROPRIATE FOR YOUR APPLICATION.      0702
  766. C  YOU CAN ALSO READ IN THE MEAN SQUARED FORM FACTORS WITH -                0703
  767. C      READ (NIN,...) (RUSER(J+50),J=1,NG)                                  0704
  768. C      THIS INPUT DATA WOULD HAVE TO BE BETWEEN CARD SETS 13 AND 14A        0705
  769. C      (SEE THE USERS MANUAL.)                                              0706
  770. C-----------------------------------------------------------------------    0707
  771.       IF (NG .GT. 500) CALL ERRMES (2,.TRUE.,IHOLER,NOUT)
  772.       DO 120 J=1,NG                                                         0709
  773.         IF (LUSER(3) .AND. RUSER(16).GT.0.) GO TO 121                       0710
  774.         RUSER(J+50)=1.                                                      0711
  775.         GO TO 120                                                           0712
  776. C-----------------------------------------------------------------------    0713
  777. C  COMPUTE AVERAGE FORM FACTOR.                                             0714
  778. C-----------------------------------------------------------------------    0715
  779.   121   DELTA=0.                                                            0716
  780.         TRSTRT=USERTR(G(J),1)                                               0717
  781.         TREND=TRSTRT                                                        0718
  782.         NPTS=IUSER(18)+1                                                    0719
  783.         IF (J.NE.1 .AND. J.NE.NG) NPTS=NPTS+IUSER(18)                       0720
  784.         IF (NPTS .LE. 1) GO TO 122                                          0721
  785.         IF (J .NE. 1) TRSTRT=.5*(USERTR(G(J-1),1)+USERTR(G(J),1))           0722
  786.         IF (J .NE. NG) TREND=.5*(USERTR(G(J+1),1)+USERTR(G(J),1))           0723
  787.         DELTA=(TREND-TRSTRT)/FLOAT(NPTS-1)                                  0724
  788.   122   SUM=0.                                                              0725
  789.         TR=TRSTRT-DELTA                                                     0726
  790.         DO 125 K=1,NPTS                                                     0727
  791.           TR=TR+DELTA                                                       0728
  792.           GPOINT=USERTR(TR,2)                                               0729
  793. C-----------------------------------------------------------------------    0730
  794. C  YOU MUST REPLACE THE STATEMENTS BETWEEN HERE AND NO. 135 WITH THOSE      0731
  795. C      APPROPRIATE FOR YOUR FORM FACTOR IF IT IS NOT THE RAYLEIGH-DEBYE     0732
  796. C      APPROXIMATION FOR A HOLLOW SPHERE.                                   0733
  797. C  PINNER,POUTER,PAVG = (MAGNITUDE OF SCATTERING VECTOR)*(INNER,OUTER,      0734
  798. C                                                       AVERAGE RADIUS)     0735
  799. C  RUSER(20) = MAGNITUDE OF SCATTERING VECTOR IN CM**(-1),                  0736
  800. C  GPOINT = OUTER RADIUS IN CM.                                             0737
  801. C  TERM = FORM FACTOR FOR G=GPOINT.                                         0738
  802. C-----------------------------------------------------------------------    0739
  803.           PINNER=0.                                                         0740
  804.           IF (RUSER(24).GT.0. .AND. RUSER(24).LT.GPOINT) PINNER=            0741
  805.      1    RUSER(20)*(GPOINT-RUSER(24))                                      0742
  806.           POUTER=RUSER(20)*GPOINT                                           0743
  807.           PAVG=.5*(POUTER+PINNER)                                           0744
  808.           PDELTA=PAVG-PINNER                                                0745
  809.           PD2=PDELTA**2                                                     0746
  810.           COSPAV=COS(PAVG)                                                  0747
  811.           IF (PDELTA .LE. .2) TERM=COSPAV*PD2*(1.-PD2*(28.-PD2)/280.)       0748
  812.      1    +PAVG*SIN(PAVG)*(3.-PD2*(.5-.025*PD2))                            0749
  813.           IF (PDELTA .GT. .2) TERM=3.*(SIN(PDELTA)*(PAVG*SIN(PAVG)+         0750
  814.      1    COSPAV)/PDELTA-COSPAV*COS(PDELTA))                                0751
  815.           TERM=TERM/(POUTER*(POUTER+PINNER)+PINNER**2)                      0752
  816.   135     SUM=SUM+TERM**2                                                   0753
  817.   125   CONTINUE                                                            0754
  818.         RUSER(J+50)=SUM/FLOAT(NPTS)                                         0755
  819.   120 CONTINUE                                                              0756
  820.       K=NG+50                                                               0757
  821.  5120 FORMAT (/21H SQUARED FORM FACTORS/(1P10E13.3))                        0758
  822.       IF (LUSER(3) .AND. RUSER(16).GT.0.) WRITE (NOUT,5120)                 0759
  823.      1 (RUSER(J),J=51,K)                                                    0760
  824. C-----------------------------------------------------------------------    0761
  825. C  END OF CALCULATION OF MEAN SQUARED FORM FACTORS.                         0762
  826. C-----------------------------------------------------------------------    0763
  827. C  PUT MEAN SQUARED FORM FACTOR IN FORMF2.  NORMALLY THIS IS JUST           0764
  828. C      RUSER(JG+50).  HOWEVER, WITH CALLS FROM USEREX, G(NG+1) CAN HAVE     0765
  829. C      ANY VALUE.  IN THIS CASE, THE FORM FACTOR IS ESTIMATED BY LINEAR     0766
  830. C      INTERPOLATION USING THE TWO GRID POINTS NEAREST G(NG+1).             0767
  831. C      ADVANTAGE IS TAKEN OF THE FACT THAT G(J) IS STRICTLY MONOTONIC       0768
  832. C      FOR J=1,...,NG.                                                      0769
  833. C-----------------------------------------------------------------------    0770
  834.   150 FORMF2=1.                                                             0771
  835.       IF (.NOT.LUSER(3) .OR. RUSER(16).LE.0.) GO TO 158                     0772
  836.       IF (JG .EQ. NG+1) GO TO 152                                           0773
  837.       FORMF2=RUSER(JG+50)                                                   0774
  838.       GO TO 158                                                             0775
  839.   152 IF ((G(NG+1)-G(1))*(G(NG+1)-G(NG)) .GT. 0.) CALL ERRMES (3,           0776
  840.      1 .TRUE.,IHOLER,NOUT)                                                  0777
  841.       SGN=SIGN(1.,G(2)-G(1))                                                0778
  842.       DO 155 J=2,NG                                                         0779
  843.         JJ=J                                                                0780
  844.         IF ((G(JJ)-G(NG+1))*SGN .GE. 0.) GO TO 157                          0781
  845.   155 CONTINUE                                                              0782
  846.   157 FORMF2=RUSER(JJ+49)+(RUSER(JJ+50)-RUSER(JJ+49))*(G(NG+1)-G(JJ-1))/    0783
  847.      1 (G(JJ)-G(JJ-1))                                                      0784
  848.   158 IF (AMIN1(ABS(RUSER(21)),ABS(RUSER(22))) .LE. 0.) CALL ERRMES (4,     0785
  849.      1 .TRUE.,IHOLER,NOUT)                                                  0786
  850.       USERK=0.                                                              0787
  851.       IF (IUSER(10) .NE. 1) GO TO 200                                       0788
  852. C-----------------------------------------------------------------------    0789
  853. C  FOR MOLECULAR WEIGHT DISTRIBUTIONS.                                      0790
  854. C-----------------------------------------------------------------------    0791
  855.       IF ((RUSER(22).LE.0. .AND. G(JG).LE.0.) .OR. G(JG).LT.0.)             0792
  856.      1 CALL ERRMES (5,.TRUE.,IHOLER,NOUT)                                   0793
  857.       IF (ABS(.5+RUSER(22)) .GT. 1.E-5) GO TO 160                           0794
  858.       EX=RUSER(21)*T(JT)/SQRT(G(JG))                                        0795
  859.       GO TO 170                                                             0796
  860.   160 EX=RUSER(21)*T(JT)*G(JG)**RUSER(22)                                   0797
  861.   170 PREEXP=FORMF2*G(JG)                                                   0798
  862.       GO TO 500                                                             0799
  863.   200 IF (IUSER(10) .NE. 2) GO TO 300                                       0800
  864. C-----------------------------------------------------------------------    0801
  865. C  FOR DIFFUSION-COEFFICIENT DISTRIBUTIONS OR LAPLACE TRANSFORMS.           0802
  866. C-----------------------------------------------------------------------    0803
  867.       EX=RUSER(21)*G(JG)*T(JT)                                              0804
  868.       PREEXP=FORMF2                                                         0805
  869.       GO TO 500                                                             0806
  870.   300 IF (IUSER(10) .NE. 3) GO TO 400                                       0807
  871. C-----------------------------------------------------------------------    0808
  872. C  FOR SPHERICAL-RADIUS DISTRIBUTIONS.                                      0809
  873. C-----------------------------------------------------------------------    0810
  874.       IF (G(JG) .LE. 0.) CALL ERRMES (6,.TRUE.,IHOLER,NOUT)                 0811
  875.       EX=RUSER(21)*T(JT)/G(JG)                                              0812
  876.       PREEXP=FORMF2*G(JG)**3                                                0813
  877.       GO TO 500                                                             0814
  878. C-----------------------------------------------------------------------    0815
  879. C  GENERAL FORM OF KERNEL - WHEN IUSER(10)=4.                               0816
  880. C-----------------------------------------------------------------------    0817
  881.   400 EX=0.                                                                 0818
  882.       IF (G(JG) .LE. 0.) GO TO 410                                          0819
  883. C-----------------------------------------------------------------------    0820
  884. C  G(JG) IS POSITIVE.                                                       0821
  885. C-----------------------------------------------------------------------    0822
  886.       EX=RUSER(21)*T(JT)*G(JG)**RUSER(22)                                   0823
  887.       PREEXP=FORMF2*G(JG)**RUSER(23)                                        0824
  888.       GO TO 500                                                             0825
  889.   410 IF (ABS(G(JG)) .LE. 0.) GO TO 420                                     0826
  890. C-----------------------------------------------------------------------    0827
  891. C  G(JG) IS NEGATIVE.                                                       0828
  892. C-----------------------------------------------------------------------    0829
  893.       J=INT(RUSER(22)+SIGN(.5,RUSER(22)))                                   0830
  894.       JJ=INT(RUSER(23)+SIGN(.5,RUSER(23)))                                  0831
  895.       IF (AMAX1(ABS(RUSER(22)-FLOAT(J)),ABS(RUSER(23)-FLOAT(JJ))) .GT.      0832
  896.      1 1.E-5) CALL ERRMES (7,.TRUE.,IHOLER,NOUT)                            0833
  897.       EX=RUSER(21)*T(JT)*G(JG)**J                                           0834
  898.       PREEXP=FORMF2*G(JG)**JJ                                               0835
  899.       GO TO 500                                                             0836
  900. C-----------------------------------------------------------------------    0837
  901. C  G(JG)=0.                                                                 0838
  902. C-----------------------------------------------------------------------    0839
  903.   420 IF (RUSER(22).LT.0. .OR. RUSER(23).GT.0.) RETURN                      0840
  904.       IF (RUSER(23) .LT. 0.) CALL ERRMES (8,.TRUE.,IHOLER,NOUT)             0841
  905.       PREEXP=FORMF2                                                         0842
  906.   500 IF (EX .LT. EXMAX) USERK=PREEXP*EXP(-EX)                              0843
  907.       RETURN                                                                0844
  908.       END                                                                   0845
  909. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0846
  910. C  FUNCTION USERLF.  THIS IS A USER-SUPPLIED ROUTINE (NEEDED IF             0847
  911. C      NLINF IS INPUT POSITIVE) TO CALCULATE THE NLINF ADDITIONAL           0848
  912. C      KNOWN FUNCTIONS THAT ARE PRESENT IN UNKNOWN AMOUNTS                  0849
  913. C      IN THE DATA.                                                         0850
  914. C  JY = THE SUBSCRIPT OF THE DATA POINT.                                    0851
  915. C  JLINF = INDEX TELLING WHICH OF THE NLINF FUNCTIONS IS TO BE              0852
  916. C      EVALUATED.  (1 .LE. JLINF .LE. NLINF)                                0853
  917. C  NYDIM = THE DIMENSION OF THE ARRAY T.  IT CAN BE MY OR NY.               0854
  918. C  BELOW IS ILLUSTRATED THE CASE WHERE 2 SETS OF DATA CAN BE                0855
  919. C      COMBINED AND EACH CAN HAVE A DIFFERENT CONSTANT ADDITIVE             0856
  920. C      BACKGROUND (BASELINE).  THE FIRST IUSER(2) LOCATIONS IN              0857
  921. C      Y, T, ETC. ARE OCCUPIED BY THE FIRST DATA SET.  THE SECOND SET       0858
  922. C      OCCUPIES LOCATIONS IUSER(2)+1 THRU NY.  THEREFORE JLINF=1 OR 2,      0859
  923. C      AND USERLF=1. OR 0. DEPENDING ON WHETHER THE (JY)TH DATA POINT       0860
  924. C      BELONGS TO DATA SET JLINF OR NOT.                                    0861
  925. C      IF, HOWEVER, IUSER(2)=0 AND NLINF=1, THEN IT IS ASSUMED THAT         0862
  926. C      THERE IS ONLY ONE SET OF DATA AND ONLY ONE BASELINE.  (THIS          0863
  927. C      SAVES YOU THE TROUBLE OF SETTING IUSER(2)=NY EVERY TIME NY           0864
  928. C      CHANGES.)                                                            0865
  929. C      IF NLINF=0, THEN THERE WILL BE NO BASELINE.                          0866
  930. C-----------------------------------------------------------------------    0867
  931. C  CALLS SUBPROGRAMS - ERRMES                                               0868
  932. C-----------------------------------------------------------------------    0869
  933.       FUNCTION USERLF (JY,JLINF,T,NYDIM)                                    0870
  934.       DOUBLE PRECISION PRECIS, RANGE                                        0871
  935.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0872
  936.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0873
  937.       DIMENSION T(NYDIM), IHOLER(6)                                         0874
  938.       COMMON /DBLOCK/ PRECIS, RANGE                                         0875
  939.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0876
  940.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0877
  941.      2 SRANGE                                                               0878
  942.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0879
  943.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0880
  944.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0881
  945.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0882
  946.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0883
  947.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0884
  948.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0885
  949.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0886
  950.      2 LUSER(30)                                                            0887
  951.       DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HL, 1HF/                             0888
  952.       IF (JY.GT.NY .OR. JY.LE.0) CALL ERRMES (1,.TRUE.,IHOLER,NOUT)         0889
  953. C-----------------------------------------------------------------------    0890
  954. C  THE FOLLOWING STATEMENTS MUST BE REPLACED BY THE APPROPRIATE             0891
  955. C      ONES FOR YOUR ADDITIVE FUNCTIONS.                                    0892
  956. C-----------------------------------------------------------------------    0893
  957.       IF (JLINF.LT.1 .OR. JLINF.GT.2) CALL ERRMES (2,.TRUE.,IHOLER,         0894
  958.      1 NOUT)                                                                0895
  959.       USERLF=0.                                                             0896
  960.       IF ((JY.LE.IUSER(2) .AND. JLINF.EQ.1) .OR. (JY.GT.IUSER(2) .AND.      0897
  961.      1 JLINF.EQ.2) .OR. IUSER(2).LE.0) USERLF=1.                            0898
  962.       RETURN                                                                0899
  963.       END                                                                   0900
  964. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0901
  965. C  SUBROUTINE USERNQ.  THIS IS A USER-SUPPLIED ROUTINE (ONLY                0902
  966. C      CALLED WHEN DOUSNQ IS INPUT AS .TRUE.) TO SET NINEQ                  0903
  967. C      (THE NO. OF INEQUALITY CONSTRAINTS) AND TO PUT THE                   0904
  968. C      INEQUALITY-CONSTRAINT MATRIX IN THE FIRST NINEQ                      0905
  969. C      ROWS OF AINEQ AND TO PUT THE RIGHT HAND SIDES OF THE                 0906
  970. C      INEQUALITIES IN COLUMN NGLP1 OF AINEQ.                               0907
  971. C  I.E., (SUM FROM J=1 TO NGL OF (AINEQ(I,J)*SOLUTION(J))) .GE.             0908
  972. C      AINEQ(I,NGLP1), I=1,NINEQ.  SEE EQ. (3.6).                           0909
  973. C  NOTE - IF THE SOLUTION IS TO BE NONNEGATIVE AT ALL NG GRID               0910
  974. C      POINTS, DO NOT USE USERNQ TO SET THESE CONSTRAINTS -                 0911
  975. C      SIMPLY INPUT NONNEG=.TRUE. INSTEAD.                                  0912
  976. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       0913
  977. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     0914
  978. C  BELOW IS ILLUSTRATED THE CASE WHERE THE NLINF COEFFICIENTS OF            0915
  979. C      THE NLINF LINEAR FUNCTIONS ARE CONSTRAINED TO BE                     0916
  980. C      NONNEGATIVE.                                                         0917
  981. C-----------------------------------------------------------------------    0918
  982. C  CALLS SUBPROGRAMS - ERRMES                                               0919
  983. C-----------------------------------------------------------------------    0920
  984.       SUBROUTINE USERNQ (AINEQ,MG,MINEQ)                                    0921
  985.       DOUBLE PRECISION PRECIS, RANGE                                        0922
  986.       DOUBLE PRECISION AINEQ, ONE, ZERO                                     0923
  987.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  0924
  988.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              0925
  989.       DIMENSION AINEQ(MINEQ,MG)                                             0926
  990.       DIMENSION IHOLER(6)                                                   0927
  991.       COMMON /DBLOCK/ PRECIS, RANGE                                         0928
  992.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         0929
  993.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     0930
  994.      2 SRANGE                                                               0931
  995.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     0932
  996.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       0933
  997.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             0934
  998.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              0935
  999.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         0936
  1000.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            0937
  1001.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  0938
  1002.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            0939
  1003.      2 LUSER(30)                                                            0940
  1004.       DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HN, 1HQ/                             0941
  1005. C     ZERO=0.E0!SP                                                          0942
  1006.       ZERO=0.D0                                                             0943
  1007. C     ONE=1.E0!SP                                                           0944
  1008.       ONE=1.D0                                                              0945
  1009. C-----------------------------------------------------------------------    0946
  1010. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         0947
  1011. C      FOR YOUR APPLICATION.                                                0948
  1012. C-----------------------------------------------------------------------    0949
  1013.       IF (NLINF .LE. 0) RETURN                                              0950
  1014.       NINEQ=NLINF                                                           0951
  1015.       IF (NINEQ .GT. MINEQ) CALL ERRMES (1,.TRUE.,IHOLER,NOUT)              0952
  1016.       DO 110 J=1,NINEQ                                                      0953
  1017.         DO 120 K=1,NGLP1                                                    0954
  1018.           AINEQ(J,K)=ZERO                                                   0955
  1019.   120   CONTINUE                                                            0956
  1020.         K=NG+J                                                              0957
  1021.         AINEQ(J,K)=ONE                                                      0958
  1022.   110 CONTINUE                                                              0959
  1023.       RETURN                                                                0960
  1024.       END                                                                   0961
  1025. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    0962
  1026. C  SUBROUTINE USEROU.  THIS IS A USER-SUPPLIED ROUTINE (ONLY CALLED         0963
  1027. C      WHEN DOUSOU=.TRUE.) THAT YOU CAN USE TO PRODUCE YOUR OWN EXTRA       0964
  1028. C      OUTPUT.                                                              0965
  1029. C  G CONTAINS THE NG GRID POINTS.                                           0966
  1030. C  SOL CONTAINS NG+NLINF VALUES - FIRST THE NG SOLUTION VALUES AND THEN     0967
  1031. C      THE NLINF LINEAR COEFFICIENTS.                                       0968
  1032. C  EXACT CONTAINS THE NG VALUES OF THE SECOND CURVE TO BE PLOTTED THAT      0969
  1033. C      HAS BEEN COMPUTED IN USERSX (ONLY IF ONLY1=.FALSE.).                 0970
  1034. C  AA IS ( SQUARE ROOT OF THE COVARIANCE MATRIX OF THE SOLUTION)/STDDEV.    0971
  1035. C      YOU CAN USE AA AND THE LAST 4 ARGUMENTS TO COMPUTE ERROR             0972
  1036. C      ESTIMATES, AS SHOWN BELOW.                                           0973
  1037. C  (CONTIN SETS DOERR=.FALSE. IF IT WAS NOT ABLE TO COMPUTE AA OR           0974
  1038. C      STDDEV.  THE ERROR ESTIMATES THEN CANNOT BE COMPUTED AND ARE SET     0975
  1039. C      TO ZERO.)                                                            0976
  1040. C  BELOW IS ILLUSTRATED THE CASE FROM THE ANALYSIS OF CIRCULAR DICHROIC     0977
  1041. C      SPECTRA, WHERE THE NSPECT-BY-1 VECTOR SOL (THE FRACTIONS OF EACH     0978
  1042. C      REFERENCE PROTEIN SPECTRUM IN THE SPECTRUM BEING ANALYZED) IS        0979
  1043. C      RIGHT-MULTIPLIED BY THE NCLASS-BY-NSPECT MATRIX FCAP (THE X-RAY      0980
  1044. C      VALUES OF THE FRACTIONS OF THE REFERENCE PROTEINS IN EACH CLASS)     0981
  1045. C      TO YIELD THE NCLASS-BY-1 VECTOR F (THE FRACTION OF THE PROTEIN       0982
  1046. C      BEING ANALYZED IN EACH CLASS).  F AND THE ERROR ESTIMATES ARE        0983
  1047. C      THEN NORMALIZED BY DIVIDING EACH ELEMENT BY THE SUM OF THE F'S       0984
  1048. C      (WHICH IS ALSO PRINTED AS THE SCALE FACTOR, SUMF).                   0985
  1049. C  NSPECT = THE NUMBER OF REFERENCE PROTEIN CD SPECTRA.                     0986
  1050. C  NCLASS = THE NUMBER OF CONFORMATIONAL CLASSES.                           0987
  1051.       SUBROUTINE USEROU (CQUAD,G,SOL,EXACT,AA,MG,STDDEV,DOERR,NGLEY)        0988
  1052.       DOUBLE PRECISION AA                                                   0989
  1053.       DOUBLE PRECISION PRECIS, RANGE                                        0990
  1054.       LOGICAL DOCHOS, DOERR, DOMOM, DOUSIN, DOUSNQ, LAST,                   0991
  1055.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                      0992
  1056.       DIMENSION CQUAD(MG), G(MG), SOL(MG), EXACT(MG), AA(MG,MG)             0993
  1057. C-----------------------------------------------------------------------    0994
  1058. C  IF YOU CHANGE NSPECT OR NCLASS IN THE DATA STATEMENT BELOW, THEN YOU     0995
  1059. C      MUST READJUST THE DIMENSIONS IN THE FOLLOWING STATEMENT TO           0996
  1060. C     DIMENSION FCAP(NCLASS,NSPECT), F(NCLASS), ERROR(NCLASS)               0997
  1061. C      AND, OF COURSE, MODIFY FCAP (THE X-RAY FRACTIONS) AND NSPECT         0998
  1062. C      AND NCLASS IN THE DATA STATEMENT BELOW.                              0999
  1063. C-----------------------------------------------------------------------    1000
  1064.       DIMENSION FCAP(3,16), F(3), ERROR(3)                                  1001
  1065.       COMMON /DBLOCK/ PRECIS, RANGE                                         1002
  1066.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1003
  1067.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1004
  1068.      2 SRANGE                                                               1005
  1069.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1006
  1070.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1007
  1071.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1008
  1072.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1009
  1073.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1010
  1074.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1011
  1075.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1012
  1076.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1013
  1077.      2 LUSER(30)                                                            1014
  1078.       DATA NSPECT/16/, NCLASS/3/, FCAP/                                     1015
  1079.      1     .79,.00,.21 ,  .41,.16,.43 ,  .23,.40,.37 ,                      1016
  1080.      2     .28,.14,.58 ,  .45,.24,.31 ,  .09,.34,.57 ,                      1017
  1081.      3     .02,.51,.47 ,  .39,.00,.61 ,  .07,.52,.41 ,                      1018
  1082.      4     .24,.15,.61 ,  .51,.24,.25 ,  .62,.05,.33 ,                      1019
  1083.      5     .37,.15,.48 ,                 .28,.33,.39 ,                      1020
  1084.      6                    .54,.12,.34 ,  .26,.44,.30 /                      1021
  1085.       SUMF=0.                                                               1022
  1086.       DO 110 J=1,NCLASS                                                     1023
  1087.         F(J)=0.                                                             1024
  1088.         DO 120 K=1,NSPECT                                                   1025
  1089.           F(J)=F(J)+SOL(K)*FCAP(J,K)                                        1026
  1090.   120   CONTINUE                                                            1027
  1091.         SUMF=SUMF+F(J)                                                      1028
  1092.   110 CONTINUE                                                              1029
  1093.       DO 140 J=1,NCLASS                                                     1030
  1094.         F(J)=F(J)/SUMF                                                      1031
  1095.   140 CONTINUE                                                              1032
  1096.       FACTOR=STDDEV/SUMF                                                    1033
  1097. C-----------------------------------------------------------------------    1034
  1098. C  RUSER(14) IS THE SCALE FACTOR BY WHICH THE DATA SPECTRUM IS              1035
  1099. C      DIVIDED (SEE USERS MANUAL).  NORMALLY, FACTOR=STDDEV ABOVE.          1036
  1100.       IF (ABS(RUSER(14)) .GT. 0.) SUMF=SUMF/RUSER(14)                       1037
  1101. C-----------------------------------------------------------------------    1038
  1102. C  ABOVE, THE NCLASS-BY-1 VECTOR F WAS PRODUCED BY MULTIPLYING THE          1039
  1103. C      NSPECT-BY-1 SOLUTION SOL BY THE NCLASS-BY-NSPECT MATRIX FCAP.        1040
  1104. C      THIS IS A VERY COMMON TYPE OF TRANSFORMATION, THAT OCCURS IN         1041
  1105. C      MANY APPPLICATIONS, E.G., WHEN THE SOLUTION IS REPRESENTED BY        1042
  1106. C      A SUM OF BASIS (E.G., SPLINE) FUNCTIONS.  IN THIS LATTER CASE,       1043
  1107. C      SOL WOULD BE THE EXPANSION COEFFICIENTS AND F WOULD BE THE           1044
  1108. C      SOLUTION VALUES AT NCLASS GRID POINTS (SEE USERS MANUAL.)            1045
  1109. C  THE COMPUTATION OF THE NCLASS-BY-1 VECTOR ERROR, THE                     1046
  1110. C      STANDARD ERROR ESTIMATES FOR F, BELOW IS COMPLETELY GENERAL          1047
  1111. C      FOR ANY FCAP.  SO YOU DO NOT HAVE TO CHANGE ANYTHING BELOW IF        1048
  1112. C      FCAP, NCLASS, OR NSPECT ARE CHANGED.  (USUALLY NSPECT=NGL, BUT       1049
  1113. C      THIS IS NOT NECESSARY.)                                              1050
  1114. C-----------------------------------------------------------------------    1051
  1115.       DO 210 J=1,NCLASS                                                     1052
  1116.         ERROR(J)=0.                                                         1053
  1117.         IF (.NOT.DOERR) GO TO 210                                           1054
  1118.         DO 220 K=1,NGLEY                                                    1055
  1119.           SUM=0.                                                            1056
  1120.           DO 230 L=1,NSPECT                                                 1057
  1121.             SUM=SUM+FCAP(J,L)*AA(L,K)                                       1058
  1122.   230     CONTINUE                                                          1059
  1123.           ERROR(J)=ERROR(J)+SUM**2                                          1060
  1124.   220   CONTINUE                                                            1061
  1125.         ERROR(J)=FACTOR*SQRT(ERROR(J))                                      1062
  1126.   210 CONTINUE                                                              1063
  1127. C-----------------------------------------------------------------------    1064
  1128. C  IF YOU CHANGE THE CLASSES, THEN YOU MUST MODIFY THE FOLLOWING            1065
  1129. C      FORMAT AND WRITE STATEMENTS.                                         1066
  1130. C-----------------------------------------------------------------------    1067
  1131.  5140 FORMAT (/23X,5HHELIX,3X,10HBETA-SHEET,4X,                             1068
  1132.      1 9HREMAINDER,16X,12HSCALE FACTOR/                                     1069
  1133.      2 9H FRACTION,F19.2,2F13.2,F28.3/                                      1070
  1134.      3 15H STANDARD ERROR,1P3E13.1)                                         1071
  1135.       WRITE (NOUT,5140) F,SUMF,ERROR                                        1072
  1136.       RETURN                                                                1073
  1137.       END                                                                   1074
  1138. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1075
  1139. C  SUBROUTINE USERRG.  THIS IS A USER-SUPPLIED ROUTINE (NEEDED              1076
  1140. C      WHEN NORDER IS INPUT NEGATIVE) TO SET NREG AND TO PUT A              1077
  1141. C      SPECIAL USER-DEFINED REGULARIZOR IN THE FIRST NREG COLUMNS           1078
  1142. C      AND ROWS OF REG AND THE RIGHT-HAND-SIDE (R.H.S.) OF THE              1079
  1143. C      REGULARIZOR IN COLUMN NGLP1 OF REG.                                  1080
  1144. C  NOTE - IF IWT = 1 OR 4, THEN USERRG IS CALLED 2 TIMES.                   1081
  1145. C         IF IWT = 2, 3, OR 5, THEN USERRG IS CALLED 4 TIMES.               1082
  1146. C         THEREFORE, IT IS BEST TO HAVE ANY DATA NEEDED BY USERRG READ      1083
  1147. C         IN ONLY ONCE AND STORED (E.G., IN RUSER, AS ILLUSTRATED           1084
  1148. C         BELOW).  OTHERWISE, THIS DATA WOULD HAVE TO BE READ 2 OR 4        1085
  1149. C         TIMES.                                                            1086
  1150. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       1087
  1151. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     1088
  1152. C  BELOW IS ILLUSTRATED A REGULARIZOR THAT PENALIZES DEVIATIONS OF THE      1089
  1153. C      SOLUTION FROM AN EXPECTED SOLUTION.  THE IDENTITY MATRIX GOES        1090
  1154. C      INTO THE REGULARIZOR, AND THE EXPECTED SOLUTION IS READ INTO         1091
  1155. C      RUSER(IUSER(1)),...,RUSER(IUSER(1)+NG-1) AND THEN PUT INTO THE       1092
  1156. C      R.H.S. OF THE REGULARIZOR (COLUMN NGLP1 OF REG).  (SEE               1093
  1157. C      S. TWOMEY, JACM 10, 97 (1963).)                                      1094
  1158. C      LUSER(1) IS INPUT INITIALLY AS .FALSE. AND THEN SET TO .TRUE.        1095
  1159. C      SO THAT THE DATA IS ONLY READ ONCE.                                  1096
  1160.       SUBROUTINE USERRG (REG,MREG,MG,NREG)                                  1097
  1161.       DOUBLE PRECISION PRECIS, RANGE                                        1098
  1162.       DOUBLE PRECISION REG                                                  1099
  1163.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  1100
  1164.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              1101
  1165.       DIMENSION REG(MREG,MG)                                                1102
  1166.       COMMON /DBLOCK/ PRECIS, RANGE                                         1103
  1167.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1104
  1168.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1105
  1169.      2 SRANGE                                                               1106
  1170.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1107
  1171.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1108
  1172.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1109
  1173.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1110
  1174.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1111
  1175.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1112
  1176.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1113
  1177.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1114
  1178.      2 LUSER(30)                                                            1115
  1179. C-----------------------------------------------------------------------    1116
  1180. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         1117
  1181. C      FOR YOUR APPLICATION.                                                1118
  1182. C-----------------------------------------------------------------------    1119
  1183.       NREG=NG                                                               1120
  1184.       DO 110 J=1,NREG                                                       1121
  1185.         DO 120 K=1,NGL                                                      1122
  1186.           REG(J,K)=0.                                                       1123
  1187.   120   CONTINUE                                                            1124
  1188.         REG(J,J)=1.                                                         1125
  1189.   110 CONTINUE                                                              1126
  1190.       J=IUSER(1)                                                            1127
  1191.       K=J+NG-1                                                              1128
  1192.       IF (LUSER(1)) GO TO 200                                               1129
  1193.  5200 FORMAT (5E15.6)                                                       1130
  1194.       READ (NIN,5200) (RUSER(L),L=J,K)                                      1131
  1195.       WRITE (NOUT,5200) (RUSER(L),L=J,K)                                    1132
  1196.       LUSER(1)=.TRUE.                                                       1133
  1197.   200 IROW=0                                                                1134
  1198.       DO 210 L=J,K                                                          1135
  1199.         IROW=IROW+1                                                         1136
  1200.         REG(IROW,NGLP1)=RUSER(L)                                            1137
  1201.   210 CONTINUE                                                              1138
  1202.       RETURN                                                                1139
  1203.       END                                                                   1140
  1204. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1141
  1205. C  SUBROUTINE USERSI.  THIS IS A USER-SUPPLIED ROUTINE (ONLY                1142
  1206. C      CALLED WHEN SIMULA IS .TRUE.) FOR CALCULATING EXACT(J)               1143
  1207. C      (THE SIMULATED DATA BEFORE NOISE IS ADDED) AND                       1144
  1208. C      Y(J) (THE SIMULATED NOISY DATA) FOR J=1,NY.                          1145
  1209. C  EXACT(J) MUST BE COMPUTED IN USEREX.                                     1146
  1210. C  IUSER(3) = STARTING INTEGER FOR RANDOM NUMBER GENERATOR RANDOM.          1147
  1211. C  IUSER(3) AND RUSER(3) MUST BE SUPPLIED BY THE USER.                      1148
  1212. C  IUSER(3) MUST BE BETWEEN 1 AND 2147483646.  IF IT IS NOT, THEN           1149
  1213. C      IT IS SET TO THE DEFAULT VALUE OF 30171.                             1150
  1214. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       1151
  1215. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     1152
  1216. C  BELOW IS ILLUSTRATED THE CASE WHERE ZERO-MEAN                            1153
  1217. C      NORMALLY DISTRIBUTED PSEUDORANDOM NOISE IS ADDED TO EXACT(J).        1154
  1218. C      SD(J), THE STANDARD DEVIATION OF THE NOISE AT POINT J, IS            1155
  1219. C      DETERMINED BY IWT AND RUSER(3) AS FOLLOWS -                          1156
  1220. C      IWT = 1 CAUSES SD(J)=RUSER(3) FOR ALL J.                             1157
  1221. C      IWT = 2 CAUSES SD(J)=RUSER(3)*SQRT(EXACT(J)), AS APPROPRIATE         1158
  1222. C              FOR POISSON STATISTICS.  IN THE POISSON CASE,                1159
  1223. C              RUSER(3) IS JUST A SCALE FACTOR FOR THE CASE THAT            1160
  1224. C              EXACT(J) IS NOT IN NUMBER OF EVENTS, I.E.,                   1161
  1225. C              RUSER(3)=SQRT(EXACT(J)/(NO. OF EVENTS IN CHANNEL J)).        1162
  1226. C              THUS, EXACT(J)/RUSER(3)**2 IS THE POISSON VARIABLE.          1163
  1227. C              IF EXACT(J) IS ALREADY IN NO. OF EVENTS, THEN YOU            1164
  1228. C              SHOULD SET RUSER(3)=1.                                       1165
  1229. C      IWT = 3 CAUSES SD(J)=RUSER(3)*EXACT(J).                              1166
  1230. C      IWT = 4 CAUSES SD(J)=RUSER(3)/SQRTW(J).                              1167
  1231. C      IWT = 5 IS FOR THE SPECIAL CASE OF A POISSON SECOND ORDER            1168
  1232. C              CORRELATION FUNCTION IN PHOTON CORRELATION SPECTROSCOPY.     1169
  1233. C              YOU SHOULD SET RUSER(3)=1/SQRT(B), AND                       1170
  1234. C              USEREX MUST COMPUTE THE SIMULATED (1ST ORDER CORRELATION     1171
  1235. C              FUNCTION)*GAMMA, WHERE GAMMA AND B ARE GIVEN IN EQ.(6)       1172
  1236. C              OF MAKROMOL. CHEM., VOL. 180, P. 201 (1979).                 1173
  1237. C      (SEE ALSO THE USERS MANUAL.)                                         1174
  1238. C-----------------------------------------------------------------------    1175
  1239. C  CALLS SUBPROGRAMS - USEREX, RGAUSS, ERRMES                               1176
  1240. C  WHICH IN TURN CALL - RANDOM, USERK, USERLF, USERTR                       1177
  1241. C-----------------------------------------------------------------------    1178
  1242.       SUBROUTINE USERSI (EXACT,G,MG,MY,SQRTW,T,Y)                           1179
  1243.       DOUBLE PRECISION PRECIS, RANGE                                        1180
  1244.       DOUBLE PRECISION DUB                                                  1181
  1245.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  1182
  1246.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              1183
  1247.       DIMENSION T(MY), EXACT(MY), Y(MY), SQRTW(MY), G(MG)                   1184
  1248.       DIMENSION RN(2), IHOLER(6)                                            1185
  1249.       COMMON /DBLOCK/ PRECIS, RANGE                                         1186
  1250.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1187
  1251.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1188
  1252.      2 SRANGE                                                               1189
  1253.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1190
  1254.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1191
  1255.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1192
  1256.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1193
  1257.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1194
  1258.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1195
  1259.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1196
  1260.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1197
  1261.      2 LUSER(30)                                                            1198
  1262.       DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HS, 1HI/                             1199
  1263.       TWOPI=6.2831853072D0                                                  1200
  1264.       DUB=DBLE(FLOAT(IUSER(3)))                                             1201
  1265.       IF (DUB.LT.1.D0 .OR. DUB.GT.2147483646.D0) DUB=30171.D0               1202
  1266.       DO 150 J=1,NY                                                         1203
  1267.         JJ=J                                                                1204
  1268. C-----------------------------------------------------------------------    1205
  1269. C  RGAUSS DELIVERS TWO NORMAL DEVIATES WITH ZERO MEANS AND STANDARD         1206
  1270. C      DEVIATIONS 1.  THEREFORE IT IS ONLY CALLED FOR ODD J.                1207
  1271. C-----------------------------------------------------------------------    1208
  1272.         K=2-MOD(J,2)                                                        1209
  1273.         IF (K .EQ. 1) CALL RGAUSS (RN(1),RN(2),TWOPI,DUB)                   1210
  1274. C-----------------------------------------------------------------------    1211
  1275. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         1212
  1276. C      FOR YOUR APPLICATION.                                                1213
  1277. C-----------------------------------------------------------------------    1214
  1278.         EXACT(J)=USEREX(JJ,T,MY,G,MG)                                       1215
  1279. C-----------------------------------------------------------------------    1216
  1280. C  THE NEXT STATEMENT TEMPORARILY SETS THE ERROR TO A NORMAL DEVIATE        1217
  1281. C      WITH MEAN = ZERO AND STANDARD DEVIATION = RUSER(3).                  1218
  1282. C-----------------------------------------------------------------------    1219
  1283.         ERROR=RUSER(3)*RN(K)                                                1220
  1284.         IF (IWT .NE. 2) GO TO 160                                           1221
  1285.         IF (EXACT(J) .LT. 0.) CALL ERRMES (1,.TRUE.,IHOLER,NOUT)            1222
  1286.         ERROR=ERROR*SQRT(EXACT(J))                                          1223
  1287.         GO TO 190                                                           1224
  1288.   160   IF (IWT .EQ. 3) ERROR=ERROR*EXACT(J)                                1225
  1289.         IF (IWT .NE. 4) GO TO 170                                           1226
  1290.         IF (SQRTW(J) .LE. 0.) CALL ERRMES (2,.TRUE.,IHOLER,NOUT)            1227
  1291.         ERROR=ERROR/SQRTW(J)                                                1228
  1292.   170   IF (IWT .NE. 5) GO TO 190                                           1229
  1293. C-----------------------------------------------------------------------    1230
  1294. C  SPECIAL CASE OF A POISSON SECOND ORDER CORRELATION FUNCTION IN           1231
  1295. C      PHOTON CORRELATION SPECTROSCOPY.                                     1232
  1296. C  G2 = NOISE-FREE NORMALIZED 2ND ORDER CORRELATION FUNCTION.               1233
  1297. C  G2N1 = NOISY 2ND ORDER CORRELATION FUNCTION LESS 1.                      1234
  1298. C  Y(J) = NOISY FIRST ORDER CORRELATION FUNCTION.  IT IS EVALUATED          1235
  1299. C         BELOW WITH THE FUNCTION SIGN() SO THAT NEGATIVE DATA POINTS       1236
  1300. C         REMAIN NEGATIVE.  THIS PREVENTS A BIAS TOWARD POSITIVE            1237
  1301. C         NOISE COMPONENTS.                                                 1238
  1302. C-----------------------------------------------------------------------    1239
  1303.         G2=1.+EXACT(J)**2                                                   1240
  1304.         G2N1=G2-1.+ERROR*SQRT(G2)                                           1241
  1305.         Y(J)=SIGN(SQRT(ABS(G2N1)),G2N1)                                     1242
  1306.         GO TO 150                                                           1243
  1307.   190   Y(J)=EXACT(J)+ERROR                                                 1244
  1308.   150 CONTINUE                                                              1245
  1309.       RETURN                                                                1246
  1310.       END                                                                   1247
  1311. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1248
  1312. C  SUBROUTINE USERSX.  THIS IS A USER-SUPPLIED ROUTINE (ONLY                1249
  1313. C      CALLED WHEN YOU HAVE INPUT ONLY1=.FALSE.)                            1250
  1314. C      TO COMPUTE EXACT(J),J=1,NG, WHICH WILL BE PLOTTED WITH               1251
  1315. C      EACH SOLUTION.  USUALLY EXACT IS THE EXACT THEORETICAL               1252
  1316. C      SOLUTION USED TO SIMULATE YOUR DATA IN USERSI EVALUATED AT           1253
  1317. C      THE GRID POINTS G(J),J=1,NG.                                         1254
  1318. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       1255
  1319. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     1256
  1320. C  BELOW IS ILLUSTRATED THE CASE WHERE EXACT IS                             1257
  1321. C      G(J)**RUSER(8)*EXP(-G(J))/(FACTORIAL OF RUSER(8)), WHERE             1258
  1322. C      1. .LE. RUSER(8) .LE. 20. AND THE G(J) ARE NONNEGATIVE.              1259
  1323. C-----------------------------------------------------------------------    1260
  1324. C  CALLS SUBPROGRAMS - GAMLN                                                1261
  1325. C-----------------------------------------------------------------------    1262
  1326.       SUBROUTINE USERSX (EXACT,G,MG)                                        1263
  1327.       DOUBLE PRECISION PRECIS, RANGE                                        1264
  1328.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  1265
  1329.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              1266
  1330.       DIMENSION EXACT(MG), G(MG)                                            1267
  1331.       COMMON /DBLOCK/ PRECIS, RANGE                                         1268
  1332.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1269
  1333.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1270
  1334.      2 SRANGE                                                               1271
  1335.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1272
  1336.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1273
  1337.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1274
  1338.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1275
  1339.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1276
  1340.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1277
  1341.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1278
  1342.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1279
  1343.      2 LUSER(30)                                                            1280
  1344. C-----------------------------------------------------------------------    1281
  1345. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         1282
  1346. C      FOR YOUR EVALUATION OF EXACT.                                        1283
  1347. C-----------------------------------------------------------------------    1284
  1348.       IF (RUSER(8).GE.1. .AND. RUSER(8).LE.20.) GO TO 120                   1285
  1349.  5120 FORMAT (/11H RUSER(8) =,E12.4,27H IS OUT OF RANGE IN USERSX.)         1286
  1350.       WRITE (NOUT,5120) RUSER(8)                                            1287
  1351.       STOP                                                                  1288
  1352.   120 EXMIN=-ALOG(SRANGE)                                                   1289
  1353.       FACTL=GAMLN(RUSER(8)+1.)                                              1290
  1354.       DO 150 J=1,NG                                                         1291
  1355.         EXACT(J)=0.                                                         1292
  1356.         IF (G(J)) 160,150,180                                               1293
  1357.   160   WRITE (NOUT,5160)                                                   1294
  1358.  5160   FORMAT (/22H NEGATIVE G IN USEREX.)                                 1295
  1359.         STOP                                                                1296
  1360.   180   EX=RUSER(8)*ALOG(G(J))-G(J)-FACTL                                   1297
  1361.         IF (EX .GE. EXMIN) EXACT(J)=EXP(EX)                                 1298
  1362.   150 CONTINUE                                                              1299
  1363.       RETURN                                                                1300
  1364.       END                                                                   1301
  1365. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1302
  1366. C  FUNCTION USERTR.  THIS IS A USER-SUPPLIED ROUTINE                        1303
  1367. C      FOR COMPUTING THE QUADRATURE-GRID TRANSFORMATION                     1304
  1368. C      (CALL IT H) H(G) WHEN IFUNCT=1, THE INVERSE TRANSFORMATION           1305
  1369. C      WHEN IFUNCT=2, AND THE DERIVATIVE OF THE TRANSFORMATION              1306
  1370. C      WHEN IFUNCT=3.  WHEN IGRID=2, G (THE QUADRATURE GRID) WILL           1307
  1371. C      BE IN EQUAL INTERVALS OF H(G) RATHER THAN IN EQUAL                   1308
  1372. C      INTERVALS OF G (AS IT IS WHEN IGRID=1 AND H IS THE                   1309
  1373. C      IDENTITY TRANSFORMATION).                                            1310
  1374. C  BELOW IS ILLUSTRATED THE CASE H(G)=ALOG(G).  FOR ANOTHER H,              1311
  1375. C      YOU CAN REPLACE THE STATEMENTS NUMBERED 210, 220, AND 230.           1312
  1376. C      THESE ARE THE ONLY STATEMENTS THAT CAN BE REPLACED.  ALSO            1313
  1377. C      NOTE THAT ONLY AN H THAT IS MONOTONIC IN THE RANGE OF                1314
  1378. C      INTEGRATION MAKES SENSE.                                             1315
  1379. C-----------------------------------------------------------------------    1316
  1380. C  CALLS SUBPROGRAMS - ERRMES                                               1317
  1381. C-----------------------------------------------------------------------    1318
  1382.       FUNCTION USERTR (X,IFUNCT)                                            1319
  1383.       DOUBLE PRECISION PRECIS, RANGE                                        1320
  1384.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  1321
  1385.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              1322
  1386.       COMMON /DBLOCK/ PRECIS, RANGE                                         1323
  1387.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1324
  1388.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1325
  1389.      2 SRANGE                                                               1326
  1390.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1327
  1391.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1328
  1392.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1329
  1393.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1330
  1394.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1331
  1395.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1332
  1396.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1333
  1397.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1334
  1398.      2 LUSER(30)                                                            1335
  1399.       DIMENSION IHOLER(6)                                                   1336
  1400.       DATA IHOLER/1HU, 1HS, 1HE, 1HR, 1HT, 1HR/                             1337
  1401.       IF (IFUNCT.LT.1 .OR. IFUNCT.GT.3) CALL ERRMES (1,.TRUE.,              1338
  1402.      1 IHOLER,NOUT)                                                         1339
  1403.       IF (IGRID .NE. 1) GO TO 200                                           1340
  1404. C-----------------------------------------------------------------------    1341
  1405. C  COMPUTE TRANSFORMATION, INVERSE, AND DERIVATIVE FOR IDENTITY             1342
  1406. C      TRANSFORMATION.                                                      1343
  1407. C-----------------------------------------------------------------------    1344
  1408.       USERTR=1.                                                             1345
  1409.       IF (IFUNCT .NE. 3) USERTR=X                                           1346
  1410.       RETURN                                                                1347
  1411.   200 IF (IGRID .NE. 2) CALL ERRMES (2,.TRUE.,IHOLER,NOUT)                  1348
  1412.       GO TO (210,220,230),IFUNCT                                            1349
  1413. C-----------------------------------------------------------------------    1350
  1414. C  COMPUTE TRANSFORMATION.                                                  1351
  1415. C-----------------------------------------------------------------------    1352
  1416.   210 USERTR=ALOG(X)                                                        1353
  1417.       RETURN                                                                1354
  1418. C-----------------------------------------------------------------------    1355
  1419. C  COMPUTE INVERSE TRANSFORMATION.                                          1356
  1420. C-----------------------------------------------------------------------    1357
  1421.   220 USERTR=EXP(X)                                                         1358
  1422.       RETURN                                                                1359
  1423. C-----------------------------------------------------------------------    1360
  1424. C  COMPUTE DERIVATIVE OF TRANSFORMATION.                                    1361
  1425. C-----------------------------------------------------------------------    1362
  1426.   230 USERTR=1./X                                                           1363
  1427.       RETURN                                                                1364
  1428.       END                                                                   1365
  1429. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1366
  1430. C  SUBROUTINE USERWT.  THIS IS A USER-SUPPLIED ROUTINE (ONLY                1367
  1431. C      NEEDED WHEN IWT IS INPUT AS 5) FOR CALCULATING SQRTW (SQUARE         1368
  1432. C      ROOTS OF THE LEAST SQUARES WEIGHTS) FROM Y, YLYFIT, AND              1369
  1433. C      ERRFIT, AS EXPLAINED IN DETAIL IN THE USERS MANUAL.                  1370
  1434. C  SEE THE USERS MANUAL FOR THE POSITION IN THE INPUT                       1371
  1435. C      DATA DECK OF ANY INPUT FOR THIS USER SUBPROGRAM.                     1372
  1436. C  BELOW IS ILLUSTRATED THE CASE FROM PHOTON CORRELATION SPECTROSCOPY,      1373
  1437. C      WHERE THE VARIANCE OF Y IS PROPORTIONAL TO (Y**2+1)/(4*Y**2).        1374
  1438.       SUBROUTINE USERWT (Y,YLYFIT,MY,ERRFIT,SQRTW)                          1375
  1439.       DOUBLE PRECISION PRECIS, RANGE                                        1376
  1440.       LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  1377
  1441.      1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              1378
  1442.       DIMENSION Y(MY), YLYFIT(MY), SQRTW(MY)                                1379
  1443.       COMMON /DBLOCK/ PRECIS, RANGE                                         1380
  1444.       COMMON /SBLOCK/ DFMIN, SRMIN,                                         1381
  1445.      1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     1382
  1446.      2 SRANGE                                                               1383
  1447.       COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     1384
  1448.      1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       1385
  1449.      2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             1386
  1450.      3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              1387
  1451.      4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         1388
  1452.      5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            1389
  1453.       COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  1390
  1454.      1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            1391
  1455.      2 LUSER(30)                                                            1392
  1456. C-----------------------------------------------------------------------    1393
  1457. C  YOU MUST REPLACE THE FOLLOWING STATEMENTS WITH THOSE APPROPRIATE         1394
  1458. C      FOR YOUR APPLICATION.                                                1395
  1459. C-----------------------------------------------------------------------    1396
  1460.       DO 110 J=1,NY                                                         1397
  1461.         DUM=AMAX1(ABS(Y(J)-YLYFIT(J)),ERRFIT)                               1398
  1462.         SQRTW(J)=2.*DUM/SQRT(DUM*DUM+1.)                                    1399
  1463.   110 CONTINUE                                                              1400
  1464.       RETURN                                                                1401
  1465.       END                                                                   1402
  1466. C++++++++++++++++ DOUBLE PRECISION VERSION 2DP (MAR 1984) ++++++++++++++    1403
  1467. C  SUBROUTINE ANALYZ.  DOES COMPLETE CONSTRAINED REGULARIZED                1404
  1468. C     ANALYSIS.                                                             1405
  1469. C-----------------------------------------------------------------------    1406
  1470. C  CALLS SUBPROGRAMS - SETSCA, SEQACC, SETREG, USEREQ, ELIMEQ, SVDRS2,      1407
  1471. C     ERRMES, DIAREG, DIAGA, SETGA1, SETVAL, LDPETC, RUNRES,                1408
  1472. C     ANPEAK, SETSGN, SETNNG                                                1409