C*********************************************************************** ! This component has been assigned Type Number 211. If that number conflicts with ! another user Type number, you will need to change it and recompile the appropriate ! dll. SUBROUTINE TYPE211(TIME,XIN,OUT,T,DTDT,PAR,INFO,ICNTRL,*) !DEC$ATTRIBUTES DLLEXPORT :: TYPE211 C ---------------------------------------------------------------------- C C TYPE 211 : LINEAR VALVE MODEL C C*********************************************************************** DOUBLE PRECISION XIN,OUT REAL PAR,S,K INTEGER INFO DIMENSION XIN(4),OUT(4),PAR(4),INFO(15) C REAL PAR,SAVED,K C INTEGER IOSTAT C LOGICAL CON C DIMENSION XIN(4),OUT(3),PAR(4),SAVED(5) C DIMENSION IOSTAT(4) C* COMMON /CHRONO/ TIME,TSTEP,TTIME,TMIN,ITIME C* COMMON /SOSCOM/ RTOLX,ATOLX,XTOL C* COMMON /XINIT/ INIT,NSAVED COMMON /SIM/ TIME0,TFINAL,DELT,IWARN COMMON /STORE/ NSTORE,IAV,S(5000) DATA INIT /0/ ! Set the version information for TRNSYS IF (INFO(7).EQ.-2) THEN INFO(12) = 15 RETURN 1 ENDIF IF (INFO(7) .EQ. 0) THEN CVI=OUT(4) ENDIF IF (INFO(7) .EQ. -1) THEN INFO(10)=5 CALL TYPECK(1,INFO,4,4,0) CVI=XIN(4) ENDIF ISAV=INFO(10) P2= XIN(1) W= XIN(2) C= XIN(3) CV= XIN(4) K= PAR(1) TCON=PAR(2) CL= PAR(3) HYS= PAR(4) C CON=(IOSTAT(3).LT.-1).OR.(IOSTAT(3).EQ.2) IF (C.LT.0.) C=0. IF (C.GT.1.0) C=1.0 IF (CV.LT.0.) CV=0. IF (CV.GT.1.0) CV=1.0 IF (TCON.GE.1.0) GOTO 1000 C* IF (ITIME.GT.1) GOTO 3000 IF (INFO(7) .GT. -1) GOTO 3000 C IF (INIT.EQ.0) SAVED(4)=CV C IF (INIT.EQ.0 .OR. SAVED(3).GT.TIME) SAVED(3)=0. C 3000 IF (TIME.GT.SAVED(3)) SAVED(5)=SAVED(4) IF (INIT .EQ. 0) S(ISAV+3)=CV IF (INIT .EQ. 0 .OR. S(ISAV+2) .GT. TIME) S(ISAV+2)=0. 3000 IF (TIME .GT. S(ISAV+2)) S(ISAV+4)=S(ISAV+3) C DCVDT=C CVAA=0 CVBB=C CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) CV=C C* A=TCON/TSTEP A=TCON/DELT IF (A.LT.0.05) GOTO 2000 C DC=C-SAVED(5) DC=C-S(ISAV+4) IF (ABS(DC).LT.1.E-10) GOTO 2000 CV=C-DC*EXP(-1./A) C DCVDT=CV CVAA=1 CVBB=0 CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) GOTO 2000 C 1000 DCVDT=(C-CV)/TCON 1000 CVAA=-1/TCON CVBB=C/TCON CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) 2000 SS=1. IF (W.NE.0.) SS=SIGN(1.,W) C CVACT=HYSTER(CV,SAVED(1),SAVED(2),SAVED(3),HYS) CVACT=HYSTER(CV,S(ISAV),S(ISAV+1),S(ISAV+2),HYS,INFO) P1=P2+SS*K*(W/((1.-CL)*CVACT+CL))**2 C SAVED(4)=CV S(ISAV+3)=CV C IF (ABS(DCVDT).LT.1.E-6) DCVDT=0.0 ! added 2/24/94 C OUT(1)=DCVDT OUT(1)=CVBAR OUT(2)=P1 OUT(3)=CVACT OUT(4)=CVF C IOSTAT(1)=0 C IF ((ABS(C-CV).LE.RTOLX*ABS(CV)+ATOLX).AND.CON) IOSTAT(1)=1 C IOSTAT(2)=1 C IOSTAT(3)=1 RETURN 1 END C*********************************************************************** C FUNCTION HYSTER(CA,CR,CRO,TOLD,HYS) FUNCTION HYSTER(CA,CR,CRO,TOLD,HYS,INFO) C --------------------------------------------------------------------- C C Models hysteresis of actuators. C CA : Rel. position of actuator (0<=CA<=1) C CR : Rel. position of valve or damper [0<=CR<=(1.-HYS)] C CRO : Value of CR at time TOLD C TOLD: Previous value of TIME C HYSTER: CR scaled such that 0<=HYSTER<=1 C C*********************************************************************** C COMMON/CHRONO/ TIME,TSTEP,TTIME,TMIN,ITIME C COMMON/XINIT/ INIT,NSAVED COMMON /SIM/ TIME0,TFINAL,DELT,IWARN DIMENSION INFO(15) DATA INIT /0/ C IF (ITIME.GT.1 .OR. INIT.NE.0) GOTO 1000 IF (INFO(7) .GT. -1 .OR. INIT .NE. 0) GOTO 1000 TOLD=TIME CRO=CA-HYS IF (CRO.LT.0.) CRO=0. CR=CRO HYSTER=CR/(1.-HYS) RETURN 1000 IF (TIME.GT.TOLD) CRO=CR TOLD=TIME C=MAX(CA,0.) C=MIN(C,1.) SLOPE=1./(1.-HYS) SLACK=C-CRO CR=CRO IF (SLACK.GT.HYS) CR=C-HYS IF (SLACK.LT.0.) CR=C HYSTER=SLOPE*CR RETURN END