Convert a set of spectra to a new spectral grid.
Conservative distribution of input energies over new grid.
237 INTEGER,
INTENT(IN) :: NSP, NFR1, NTH1, NFR2, NTH2, NDST, NDSE
238 REAL,
INTENT(IN) :: SP1(NTH1,NFR1,NSP), XF1, FR1, TH1, &
240 REAL,
INTENT(OUT) :: SP2(NTH2,NFR2,NSP)
245 INTEGER :: I, NRMAX, J, I1, L1, J1, I2, L2, J2, &
248 INTEGER,
SAVE :: IENT = 0
250 REAL :: LOW, HGH, RLOW, RHGH, BLOW, BHGH, &
251 FRAC, AUX1, AUX2, R1, R2, FACT
253 TYPE(CASE),
POINTER :: CURRENT
258 INTEGER,
POINTER :: IDTH(:,:), IDFR(:,:), NFR2T
259 REAL,
POINTER :: DTH1, DTH2, RDTH(:,:), FRQ1(:), &
260 FRQ2(:), XDF1, XDF2, RDFR(:,:)
263 CALL strace (ient,
'W3CSPC')
270 IF ( nfr1.LT.3 .OR. nth1.LT.4 .OR. xf1.LE.1. .OR. fr1.LE.0. .OR.&
271 nfr2.LT.3 .OR. nth2.LT.4 .OR. xf2.LE.1. .OR. fr2.LE.0. )
THEN
272 WRITE (ndse,900) nfr1, nth1, xf1, fr1, nfr2, nth2, xf2, fr2
276 IF ( nsp .LT. 0 )
THEN
281 IF ( nsp .EQ. 0 )
THEN
289 WRITE (ndst,9000) nsp, nfr1, nth1, xf1, fr1, th1*
rade, &
290 nfr2, nth2, xf2, fr2, th2*
rade, ftl
303 current => current%NEXT
307 WRITE (ndst,9010) i, current%NFR1, current%NTH1, &
308 current%XF1, current%FR1, current%TH1*
rade, &
309 current%NFR2, current%NTH2, &
310 current%XF2, current%FR2, current%TH2*
rade
313 found = current%NFR1.EQ.nfr1 .AND. current%NFR2.EQ.nfr2 .AND. &
314 current%NTH1.EQ.nth1 .AND. current%NTH2.EQ.nth2 .AND. &
315 current%XF1 .EQ.xf1 .AND. current%XF2 .EQ.xf2 .AND. &
316 current%FR1 .EQ.fr1 .AND. current%FR2 .EQ.fr2 .AND. &
317 current%TH1 .EQ.th1 .AND. current%TH2 .EQ.th2
341 nfr2t => current%NFR2T
351 WRITE (ndst,9021) ncases
356 IF ( ncases .EQ. 1 )
THEN
360 ALLOCATE ( current%NEXT )
361 current => current%NEXT
366 current%ICASE = ncases
381 dth1 =
tpi / real(nth1)
383 dth2 =
tpi / real(nth2)
385 IF ( dth1 .LE. dth2 )
THEN
388 nrmax = 2 + int(dth1/dth2)
391 ALLOCATE (current%IDTH(0:nrmax,nth1),current%RDTH(nrmax,nth1))
398 low = th1 + real(i-1)*dth1 - 0.5*dth1
400 rlow = 1. + (low-th2)/dth2
401 rhgh = 1. + (hgh-th2)/dth2
402 DO j=nint(rlow), nint(rlow)+nrmax-1
403 blow = th2 + real(j-1)*dth2 - 0.5*dth2
405 frac = (min(bhgh,hgh)-max(blow,low)) / (hgh-low)
406 IF ( frac .GT. 1.e-5 )
THEN
407 idth(0,i) = idth(0,i) + 1
408 idth(idth(0,i),i) = 1 + mod(j-1+nth2,nth2)
409 rdth(idth(0,i),i) = frac
416 ALLOCATE ( current%FRQ1(nfr1), current%FRQ2(nfr2) )
422 frq1(i) = xf1 * frq1(i-1)
427 frq2(i) = xf2 * frq2(i-1)
431 xdf1 = 0.5 * ( xf1 - 1./xf1 )
433 xdf2 = 0.5 * ( xf2 - 1./xf2 )
435 IF ( xdf1 .LE. xdf2 )
THEN
445 IF ( aux1 .LT. 0. )
EXIT
449 ALLOCATE (current%IDFR(0:nrmax,nfr1),current%RDFR(nrmax,nfr1))
457 hgh = 0.5 * ( frq1(i) + frq1(i+1) )
458 low = hgh - xdf1*frq1(i)
460 low = 0.5 * ( frq1(i) + frq1(i-1) )
461 hgh = low + xdf1*frq1(i)
465 bhgh = 0.5 * ( frq2(j) + frq2(j+1) )
466 blow = bhgh - xdf2*frq2(j)
468 blow = 0.5 * ( frq2(j) + frq2(j-1) )
469 bhgh = blow + xdf2*frq2(j)
471 IF ( bhgh .LE. low ) cycle
472 IF ( blow .GE. hgh )
EXIT
473 frac = (min(bhgh,hgh)-max(blow,low)) / (hgh-low)
474 IF ( frac .LT. 1.e-5 ) cycle
475 idfr(0,i) = idfr(0,i) + 1
476 idfr(idfr(0,i),i) = j
477 rdfr(idfr(0,i),i) = frac
481 nfr2t => current%NFR2T
485 bhgh = 0.5 * ( frq2(j) + frq2(j+1) )
487 blow = 0.5 * ( frq2(j) + frq2(j-1) )
488 bhgh = blow + xdf2*frq2(j)
490 IF ( bhgh .GT. hgh )
THEN
504 WRITE (ndst,9024) i, idth(0,i), &
505 (idth(j,i),rdth(j,i),j=1,idth(0,i))
507 WRITE (ndst,9023) nfr2t
509 WRITE (ndst,9024) i, idfr(0,i), &
510 (idfr(j,i),rdfr(j,i),j=1,idfr(0,i))
532 frac = r2 * frq1(i2) * xdf1 * r1 * dth1
533 sp2(j1,j2,:) = sp2(j1,j2,:) + frac * sp1(i1,i2,:)
547 fact = 1. / ( frq2(j2) * xdf2 * dth2 )
548 sp2(j1,j2,:) = fact * sp2(j1,j2,:)
559 sp2(:,j2,:) = ftl * sp2(:,j2-1,:)
566 900
FORMAT (/
' *** ERROR W3CSPC: ILLEGAL INPUT PARAMETERS ***'/ &
567 ' INPUT : ',2i8,2f10.4/ &
568 ' OUTPUT : ',2i8,2f10.4)
569 901
FORMAT (/
' *** ERROR W3CSPC: NEGATIVE NUMBER OF SPECTRA ***'/)
570 902
FORMAT (/
' *** WARNING W3CSPC: NO SPECTRA ***'/)
573 9000
FORMAT (
' TEST W3CSPC : NR. OF SPECTRA : ',i8/ &
574 ' INPUT SPECTRA : ',2i4,2f8.4,f6.1/ &
575 ' OUTPUT SPECTRA : ',2i4,2f8.4,f6.1/ &
576 ' TAIL FACTOR : ',f8.5)
580 9010
FORMAT (
' TEST W3CSPC : TEST INFO CASE : ',i8/ &
581 ' INPUT SPECTRA : ',2i4,2f8.4,f6.1/ &
582 ' OUTPUT SPECTRA : ',2i4,2f8.4,f6.1)
586 9020
FORMAT (
' TEST W3CSPC : USING STORED DATA FOR CASE',i4)
587 9021
FORMAT (
' TEST W3CSPC : COMPUTING DATA FOR CASE',i4)
590 9022
FORMAT (
' TEST W3CSPC : DIRECTIONAL DISTRIBUTION DATA')
591 9023
FORMAT (
' TEST W3CSPC : FREQUENCY DISTRIBUTION DATA, ', &
593 9024
FORMAT (
' ',i4,i4,
' :',10(i4,f5.2) )
597 9030
FORMAT (
' TEST W3CSPC : STARTING CONVERSION')
598 9031
FORMAT (
' TEST W3CSPC : ENERGIES TO DENSITIES')
599 9032
FORMAT (
' TEST W3CSPC : ADD TAIL')