$ COSMIC ALTERS FOR DIRECT FORCED VIBRATION ANALYSIS (COSDFVA)        
$ ALTER    3 $        
INSERT FILE $
FILE     UXVF=APPEND/PDT=APPEND/PD=APPEND $        
$ PERFORM INITIAL ERROR CHECKS ON NSEGS AND KMAX.        
COND     ERRORC1,NSEGS $  IF USER HAS NOT SPECIFIED NSEGS.        
COND     ERRORC1,KMAX  $  IF USER HAS NOT SPECIFIED KMAX.        
PARAM    //*EQ*/CYCIOERR /V,Y,CYCIO=0 /0 $        
COND     ERRORC1,CYCIOERR  $  IF USER HAS NOT SPECIFIED CYCIO.        
PARAM    //*DIV*/NSEG2 /V,Y,NSEGS /2 $  NSEG2 = NSEGS/2        
PARAM    //*SUB*/KMAXERR /NSEG2 /V,Y,KMAX $        
COND     ERRORC1,KMAXERR $  IF KMAX .GT. NSEGS/2        
$ SET DEFAULTS FOR PARAMETERS.        
PARAM    //*NOP*/V,Y,NOKPRT=+1 /V,Y,LGKAD=-1 $        
$ CALCULATE OMEGA, 2*OMEGA AND OMEGA**2 FROM RPS. SET DEFAULT RPS.      
PARAMR   //*MPY*/OMEGA /V,Y,RPS=0.0 /6.283185 $        
PARAMR   //*MPY*/OMEGA2 /2.0 /OMEGA $        
PARAMR   //*MPY*/OMEGASQR /OMEGA /OMEGA $        
$ GENERATE NORPS FLAG IF RPS IS ZERO.        
PARAMR   //*EQ*//V,Y,RPS /0.0 ////NORPS $        
$ MAKE SURE COUPLED MASSES HAVE NOT BEEN REQUESTED.        
PARAM    //*NOT*/NOLUMP /V,Y,COUPMASS=-1 $        
COND     ERRORC2,NOLUMP $        
$ ALTER    21,21 $  ADD SLT TO OUTPUT FOR TRLG.        
DELETE GP3 $
GP3      GEOM3,EQEXIN,GEOM2 / SLT,GPTT / NOGRAV $        
$ ALTER    24 $        
INSERT TA1,2 $
$ SINCE MULTIPLE CONSTRAINTS ARE NOT ALLOWED EXECUTE GP4 NOW SO THAT    
$ MORE ERROR CHECKS CAN BE MADE BEFORE ELEMENT GENERATION.        
$ ADD YS NEEDED FOR PSF RECOVERY IN SSG2.        
PARAM    //*MPY*/NSKIP /0/0 $        
GP4      CASECC,GEOM4,EQEXIN,GPDT,BGPDT,CSTM,/RG,YS,USET,ASET,/LUSET/
         S,N,MPCF1/S,N,MPCF2/S,N,SINGLE/S,N,OMIT/S,N,REACT/S,N,NSKIP/
         S,N,REPEAT/S,N,NOSET/S,N,NOL/S,N,NOA/C,Y,ASETOUT/C,Y,AUTOSPC $        
PURGE    GM,GMD/MPCF1/GO,GOD/OMIT/KFS,PSF,QPC/SINGLE $        
$ SUPORT BULK DATA IS NOT ALLOWED.        
PARAM    //*NOT*/REACDATA /REACT $        
COND     ERRORC3,REACDATA $        
$ EXECUTE DPD NOW SO CHECKS CAN BE MADE. ADD TRL TO OUTPUT DATA BLOCKS. 
DPD      DYNAMICS,GPL,SIL,USET / GPLD,SILD,USETD,TFPOOL,DLT,PSDL,FRL,,  
         TRL,,EQDYN / LUSET/S,N,LUSETD/NOTFL/S,N,NODLT/S,N,NOPSDL/
         S,N,NOFRL/NONLFT/S,N,NOTRL/NOEED//S,N,NOUE $        
$ MUST HAVE EITHER FREQ OR TSTEP BULK DATA.        
PARAM    //*AND*/FTERR /NOFRL /NOTRL $        
COND     ERRORC5,FTERR $  NO FREQ OR TSTEP BULK DATA.        
$ ONLY FREQUENCY OR TSTEP IS ALLOWED IN THE CASE CONTROL        
PARAML   CASECC //*TABLE1*/1/14//FREQSET $        
PARAML   CASECC //*TABLE1*/1/38//TIMESET $        
PARAM    //*MPY*/FREQTIME /FREQSET /TIMESET $        
PARAM    //*NOT*/FTERR1 /FREQTIME $        
PARAM    //*LE*/NOFREQ /FREQSET /0 $        
PARAM    //*LE*/NOTIME /TIMESET /0 $        
COND     ERRORC6,FTERR1 $  BOTH FREQ AND TSTEP IN CASE CONTROL DECK.    
$ EPOINT BULK DATA NOT ALLOWED        
PARAM    //*NOT*/EXTRAPTS /NOUE $        
COND     ERRORC4,EXTRAPTS $        
$ GENERATE DATA FOR CYCT2 MODULE.        
GPCYC    GEOM4,EQDYN,USETD /CYCDD /CTYPE=ROT /S,N,NOGO $        
COND     ERRORC1,NOGO $        
$ ALTER    34 $        
INSERT EMA,1 $
$ PRE-PURGE DATA BLOCKS THAT WILL NOT BE GENERATED        
PARAM    //*OR*/NOBM1 /NOMGG /NORPS $        
PURGE    B1GG,M1GG /NOBM1 $        
PURGE    M2GG,M2BASEXG /NOMGG $        
$ ALTER    38 $        
INSERT EMA(2),1 $
$ GENERATE DATA BLOCKS FRLX, B1GG, M1GG, M2GG AND BASEGX.        
$ GENERATE PARAMETERS FKMAX AND NOBASEX.        
FVRSTR1  CASECC,BGPDT,CSTM,DIT,FRL,MGG,, / FRLX,B1GG,M1GG,M2GG,BASEXG,
         PDZERO,, /NOMGG/V,Y,CYCIO/V,Y,NSEGS/V,Y,KMAX/S,N,FKMAX/
         V,Y,BXTID=-1/V,Y,BXPTID=-1/V,Y,BYTID=-1/V,Y,BYPTID=-1/
         V,Y,BZTID=-1/V,Y,BZPTID=-1/S,N,NOBASEX/NOFREQ/OMEGA  $        
PARAML   FRLX //*PRES*////NOFRLX $        
COND     LBLFRLX,NOFRLX $        
EQUIV    FRLX,FRL $        
LABEL    LBLFRLX $        
$ ALTER    47 $        
INSERT EMA(4),2 $
PARAM    //*ADD*/NOBGG /NOBM1 /0 $  RESET NOBGG.        
$ ALTER    58 $        
INSERT GPSTGEN $
$ REDEFINE BGG AND KGG.        
COND     LBL11A,NOBM1 $        
PARAMR   //*COMPLEX*// OMEGA2 /0.0/ CMPLX1 $        
PARAMR   //*SUB*/ MOMEGASQ / 0.0 / OMEGASQR $        
PARAMR   //*COMPLEX*// MOMEGASQ / 0.0 / CMPLX2 $        
ADD      BGG,B1GG / BGG1 / (1.0,0.0) / CMPLX1 $        
EQUIV    BGG1,BGG $        
ADD      KGG,M1GG / KGG1 / (1.0,0.0) / CMPLX2 $        
EQUIV    KGG1,KGG $        
LABEL    LBL11A        
$ ALTER    59,62 $  GP4 HAS BEEN MOVED-UP.        
DELETE GP4,-1,GP4,2 $
$ ALTER    87,87 $  DPD HAS BEEN MOVED-UP.        
DELETE DPD $
$ ALTER    112 $  PARAM AND EQUIV LOGIC DEPENDING ON LGKAD FOR FREQ/TRAN. 
INSERT GKAD,-3 $
PARAM    //*AND*/KDEKA/NOUE/NOK2PP $        
COND     LGKAD1,LGKAD $  BRANCH IN NOT FREQRESP.        
$ ALTER    113 $  SEE ALTER 112 COMMENT.        
INSERT GKAD,-2 $
JUMP     LGKAD2 $        
LABEL    LGKAD1 $        
EQUIV    M2PP,M2DD/NOA/B2PP,B2DD/NOA/K2PP,K2DD/NOA/MAA,MDD/MDEMA/       
         KAA,KDD/KDEKA $        
LABEL    LGKAD2 $        
$ ALTER    115,115 $  ADD PARAMETERS GKAD, W3 AND W4 TO GKAD.        
DELETE GKAD $
GKAD     USETD,GM,GO,KAA,BAA,MAA,K4AA,K2PP,M2PP,B2PP/KDD,BDD,MDD,GMD,   
         GOD,K2DD,M2DD,B2DD/C,Y,GKAD=TRANRESP/*DISP*/*DIRECT*/        
         C,Y,G=0.0/C,Y,W3=0.0/C,Y,W4=0.0/NOK2PP/NOM2PP/NOB2PP/MPCF1/
         SINGLE/OMIT/NOUE/NOK4GG/NOBGG/KDEK2/-1 $        
$ ALTER    116 $  SEE ALTER 112 COMMENT.        
INSERT GKAD,1 $
COND     LGKAD3,LGKAD $  BRANCH IF NOT FREQRESP.        
$ ALTER    117 $  SEE ALTER 112 COMMENT.        
INSERT GKAD,2 $
JUMP     LGKAD4 $        
LABEL    LGKAD3 $        
EQUIV    B2DD,BDD/NOGPDT/M2DD,MDD/NOSIMP/K2DD,KDD/KDEK2 $        
LABEL    LGKAD4 $        
$ ALTER    118,122 $        
DELETE FRRD,-2,VDR $
$ NEW SOLUTION LOGIC        
$ GENERATE TIME-DEPENDENT LOADS IF TSTEP WAS REQUESTED IN CASE CONTROL. 
$ USE FOL INSTEAD OF PPF TO GET OUTPUT FREQUENCY LIST.        
COND     LBLTRL1,NOTIME $        
$ LOOP THRU ALL SUBCASES FOR TIME-DEPENDENT LOADS.        
PARAM    //*MPY*/REPEATT /1 /-1 $        
PARAM    //*ADD*/APPFLG /1 /0 $  INITIALIZE FOR SDR1.        
LABEL    TRLGLOOP $        
CASE     CASECC,/CASEYY/*TRAN*/S,N,REPEATT/S,N,NOLOOP1 $        
PARAM    //*MPY*/NCOL /0 /1 $        
TRLG     CASEYY,USETD,DLT,SLT,BGPDT,SIL,CSTM,TRL,DIT,GMD,GOD,,EST,MGG,/ 
         ,,PDT1,PD1,,TOL/ NOSET/NCOL $        
SDR1     TRL,PDT1,,,,,,,,, / ,PDT, /APPFLG/*DYNAMICS* $        
SDR1     TRL,PD1 ,,,,,,,,, / ,PD , /APPFLG/*DYNAMICS* $        
PARAM    //*ADD*/APPFLG /APPFLG /1 $  APPFLG=APPFLG+1.        
COND     TRLGDONE,REPEATT $        
REPT     TRLGLOOP,100 $        
JUMP     ERROR3 $        
LABEL    TRLGDONE $        
FVRSTR2  TOL,,,,,,, / FRLZ,FOLZ,REORDER1,REORDER2,,,, /V,Y,NSEGS/
         V,Y,CYCIO/S,Y,LMAX=-1/FKMAX/S,N,FLMAX/S,N,NTSTEPS/S,N,NORO1/
         S,N,NORO2 $        
EQUIV    FRLZ,FRL // FOLZ,FOL $        
JUMP     LBLFRL2 $        
LABEL    LBLTRL1 $        
$ GENERATE FREQUENCY-DEPENDENT LOADS IF FREQUENCY WAS SELECTED IN CC.   
FRLG     CASEXX,USETD,DLT,FRL,GMD,GOD,DIT, / PPF,PSF,PDF,FOL,PHFDUM /   
         *DIRECT*/FREQY/*FREQ* $        
COND     LBLFRLX1,NOFRLX $  ZERO OUT LOAD COLUMNS IF FRLX WAS GENERATED.
MPYAD    PPF,PDZERO, / PPFX /0 $        
EQUIV    PPFX,PPF $        
LABEL    LBLFRLX1 $        
$ FORM NEW LOADS.        
COND     LBLFRL1,NOBASEX $        
MPYAD    M2GG,BASEXG, / M2BASEXG /0 $        
ADD      PPF,M2BASEXG / PPF1 /(1.0,0.0) /(-1.0,0.0) $        
EQUIV    PPF1,PPF $        
COND     LBLBASE1,NOSET $        
SSG2     USETD,GMD,YS,KFS,GOD,,PPF / ,PODUM1,PSF1,PDF1 $        
EQUIV    PSF1,PSF // PDF1,PDF $        
LABEL    LBLBASE1 $        
LABEL    LBLFRL1 $        
EQUIV    PPF,PDF/NOSET $        
$ LOADS ARE FREQUENCY-DEPENDENT        
$ PERFORM CYCLIC TRANSFORMATION ON LOADS IF CYCIO=+1.        
PARAML   PDF //*TRAILER*/1 /PDFCOLS $        
$ CALCULATE THE NUMBER OF LOADS FOR CYCIO=-1.        
PARAM    //*DIV*/NLOAD /PDFCOLS /FKMAX $ NLOAD = NF/FKMAX        
EQUIV    PDF,PXF/CYCIO $        
COND     LBLPDONE,CYCIO $        
$ CALCULATE THE NUMBER OF LOADS FOR CYCIO=1.        
PARAM    //*DIV*/NLOAD /PDFCOLS /V,Y,NSEGS $ NLOAD = NF/NSEGS        
CYCT1    PDF / PXF,GCYCF1 /CTYPE /*FORE*/V,Y,NSEGS=-1 /V,Y,KMAX=-1/
         NLOAD /S,N,NOGO $        
COND     ERRORC1,NOGO $        
JUMP     LBLPDONE $        
LABEL    LBLFRL2 $        
$ LOADS ARE TIME-DEPENDENT        
PARAM    //*NOT*/NOTCYCIO /V,Y,CYCIO $        
$ BRANCH DEPENDING ON VALUE OF CYCIO        
COND     LBLTRL2,NOTCYCIO $        
$ CYCIO=-1        
EQUIV    PD,PDTRZ1/NORO1 $        
COND     LBLRO1A,NORO1 $        
MPYAD    PD,REORDER1, / PDTRZ1 / 0 $        
LABEL    LBLRO1A $        
CYCT1    PDTRZ1 / PXTRZ1,GCYCF2 /CTYPE/*FORE*/NTSTEPS/V,Y,LMAX/FKMAX/
         S,N,NOGO $        
COND     ERRORC1,NOGO $        
EQUIV    PXTRZ1,PXFZ1/NORO2 $        
COND     LBLRO2A,NORO2 $        
MPYAD    PXTRZ1,REORDER2, / PXFZ1 /0 $        
LABEL    LBLRO2A $        
EQUIV    PXFZ1,PXF1 $        
JUMP     LBLTRL3 $        
LABEL    LBLTRL2 $        
$ CYCIO = +1        
MPYAD    PD,REORDER1, / PDTRZ2 / 0 $        
CYCT1    PDTRZ2 /PXTRZ2,GCYCF3 /CTYPE/*FORE*/NTSTEPS/V,Y,LMAX/
         V,Y,NSEGS/S,N,NOGO $        
COND     ERRORC1,NOGO $        
EQUIV    PXTRZ2,PXTR2/NORO2 $        
COND     LBLRO2B,NORO2 $        
MPYAD    PXTRZ2,REORDER2, / PXTR2 /0 $        
LABEL    LBLRO2B $        
CYCT1    PXTR2 / PXFZ2,GCYCF4 / CTYPE/*FORE*/V,Y,NSEGS/V,Y,KMAX/        
         FLMAX/S,N,NOGO $        
COND     ERRORC1,NOGO $        
EQUIV    PXFZ2,PXF1 $        
LABEL    LBLTRL3 $        
$ TIME-DEPENDENT LOADS ARE REAL. MAKE LOADS COMPLEX TO CORRESPOND       
$ TO FREQUENCY DEPENDENT LOADS. ALSO SDR2 EXPECTS LOADS TO BE COMPLEX   
$ IN FREQRESP TYPE PROBLEMS.        
COPY     PXF1 / PXF2  $  CONVERT REAL PXF1 TO COMPLEX PXF.        
ADD      PXF1,PXF2 / PXF / (0.5,1.0) / (0.5,-1.0) $        
$ DEFINE NLOAD FOR CYCT2.        
PARAM    //*ADD*/NLOAD /FLMAX /0 $  NLOAD = FLMAX        
LABEL    LBLPDONE $        
PARAM    //*ADD*/KINDEX /V,Y,KMIN=0 /0 $  INTITIALIZE KINDEX.        
$        
$ INITIALIZE UXVF IF KMIN IS NOT ZERO.        
$        
PARAM    //*ADD*/KMINL /V,Y,KMIN /-1 $        
COND     NOKMINL,KMINL $        
PARAM    //*ADD*/KMINV /0 /0 $        
LABEL    KMINLOOP $        
CYCT2    CYCDD,,,PXF,, /,,PKFZ,, /*FORE*/V,Y,NSEGS/KMINV/CYCSEQ/NLOAD/
         S,N,NOGO $        
COND     ERRORC1,NOGO $        
ADD      PKFZ, / UKVFZ / (0.0,0.0) $        
PRTPARM  //0/*KINDEX* $        
CYCT2    CYCDD,,,UKVFZ,, /,,UXVF,, /*BACK*/V,Y,NSEGS/        
         KMINV/CYCSEQ/NLOAD/S,N,NOGO $        
PRTPARM  //0/*KINDEX* $        
COND     ERRORC1,NOGO $        
PARAM    //*ADD*/KMINV /KMINV /1 $        
REPT     KMINLOOP,KMINL $        
LABEL    NOKMINL $        
LABEL    TOPCYC $  LOOP ON KINDEX        
COND     NOKPRT,NOKPRT $        
PRTPARM  //0 /*KINDEX* $        
LABEL    NOKPRT $        
CYCT2    CYCDD,KDD,MDD,,, /KKKF,MKKF,,, /*FORE*/V,Y,NSEGS/KINDEX/
         CYCSEQ=-1/NLOAD/S,N,NOGO $        
COND     ERRORC1,NOGO $        
CYCT2    CYCDD,BDD,,PXF,, /BKKF,,PKF,, /*FORE*/V,Y,NSEGS/KINDEX/
         CYCSEQ/NLOAD/S,N,NOGO $        
COND     ERRORC1,NOGO $        
$ SOLUTION        
FRRD2    KKKF,BKKF,MKKF,,PKF,FOL / UKVF /0.0/0.0/-1.0 $        
CYCT2    CYCDD,,,UKVF,, /,,UXVF,, /*BACK*/V,Y,NSEGS/KINDEX/CYCSEQ/
         NLOAD/S,N,NOGO $        
COND     ERRORC1,NOGO $        
PARAM    //*ADD*/KINDEX/KINDEX/1 $  KINDEX = KINDEX + 1        
PARAM    //*SUB*/DONE / V,Y,KMAX / KINDEX $        
COND     LCYC2,DONE $  IF KINDEX .GT. KMAX THEN EXIT        
REPT     TOPCYC,100 $        
JUMP     ERROR3 $        
LABEL    LCYC2 $        
EQUIV    UXVF,UDVF / CYCIO $        
COND     LCYC3,CYCIO $  IF CYCIO .GE. 0 THEN TRANSFORM TO PHYSICAL.     
CYCT1    UXVF / UDVF,GCYCB1 / CTYPE/*BACK*/V,Y,NSEGS/V,Y,KMAX/NLOAD $        
LABEL    LCYC3 $        
COND     LBLTRL4,NOTIME $        
EQUIV    PXF,PDF2 / CYCIO $        
COND     LCYC4,CYCIO $  IF CYCIO .GE. 0 THEN TRANSFORM TO PHYSICAL.     
CYCT1    PXF / PDF2,GCYCB2 / CTYPE/*BACK*/V,Y,NSEGS/V,Y,KMAX/NLOAD $        
LABEL    LCYC4 $        
$ IF LOADS WERE TIME-DEPENDENT THEN RECOVER PPF AND PSF FROM PXF.       
SDR1     USETD,,PDF2,,,GOD,GMD,,,, / PPFZ,, /1 /*DYNAMICS* $        
SSG2     USETD,GMD,YS,KFS,GOD,,PPFZ / ,PODUM,PSFZ,PLDUM $        
EQUIV    PPFZ,PPF // PSFZ,PSF $        
LABEL    LBLTRL4 $        
VDR      CASEXX,EQDYN,USETD,UDVF,FOL,XYCDB,/OUDVC1,/*FREQRESP*/        
         *DIRECT*/S,N,NOSORT2/S,N,NOD/S,N,NOP/0 $        
$ ALTER    138,138 $  USE FOL INSTEAD OF PPF TO GET OUTPUT FREQUENCY LIST.
DELETE SDR2 $
SDR2     CASEXX,CSTM,MPT,DIT,EQDYN,SILD,,,BGPDP,FOL,QPC,UPVC,EST,XYCDB, 
         PPF,/OPPC1,OQPC1,OUPVC1,OESC1,OEFC1,PUPVC1,,/*FREQRESP*/       
         S,N,NOSORT2 $        
$ ALTER    160 $  ADD LABEL FOR ERROR3.        
INSERT PLOT(2),4 $
LABEL    ERROR3 $        
$ ALTER    163,166 $  REMOVE ERROR1 AND ERROR2.        
DELETE PLOT(2),7,PLOT(2),10 $
$ ALTER    168 $  FORCED VIBRATION ERRORS        
INSERT END,-3 $
LABEL    ERRORC1 $  CHECK NSEGS, KMAX AND OTHER CYCLIC DATA.        
PRTPARM  //-5 /*CYCSTATICS* $        
LABEL    ERRORC2 $  COUPLED MASS NOT ALLOWED.        
PRTPARM  //0 /C,Y,COUPMASS $        
JUMP     FINIS $        
LABEL    ERRORC3 $  SUPORT BULK DATA NOT ALLOWED.        
PRTPARM  //-6 /*CYCSTATICS* $        
LABEL    ERRORC4 $  EPOINT BULK DATA NOT ALLOWED.        
PRTPARM  //0 /*NOUE* $        
JUMP     FINIS $        
LABEL    ERRORC5 $  NEITHER FREQ OR TSTEP WERE IN BULK DATA DECK.       
PRTPARM  //0 /*NOFRL* $        
PRTPARM  //0 /*NOTRL* $        
JUMP     FINIS $        
LABEL    ERRORC6 $  BOTH FREQ AND TSTEP WERE SELECTED IN CASE CONTROL.  
PRTPARM  //0 /*NOFREQ* $        
PRTPARM  //0 /*NOTIME* $        
ENDALTER $        
