SUBROUTINE TYPE184 (TIME,XIN,OUT,T,DTDT,PAR,INFO,ICNTRL,*) C************************************************************************ C Object: Noname C IISiBat Model: Type184 C C Author: C Editor: C Date: December 23, 2005 last modified: December 23, 2005 C C C *** C *** Model Parameters C *** C nominal flow kg/hr [0;+Inf] C nominal temperature difference valve ambient deltaC [0;+Inf] C maximal temperture difference valve ambient deltaC [0;+Inf] C hysteresis temperature deltaC [0;+Inf] C Resistance valve ambient any [0;+Inf] C Resistance valve water any [0;+Inf] C Capacity valve any [0;+Inf] C Valve authority - [0;1] C *** C *** Model Inputs C *** C water supply temperature C [0;+Inf] C ambient temperature C [-Inf;+Inf] C on/off - [0;1] C setpoint temperature valve C [0;+Inf] C *** C *** Model Outputs C *** C flow kg/hr [-Inf;+Inf] C *** C *** Model Derivatives C *** C (Comments and routine interface generated by TRNSYS Studio) C************************************************************************ C TRNSYS acess functions (allow to acess TIME etc.) USE TrnsysConstants USE TrnsysFunctions C----------------------------------------------------------------------------------------------------------------------- C REQUIRED BY THE MULTI-DLL VERSION OF TRNSYS !DEC$ATTRIBUTES DLLEXPORT :: TYPE184 !SET THE CORRECT TYPE NUMBER HERE C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C TRNSYS DECLARATIONS IMPLICIT NONE !REQUIRES THE USER TO DEFINE ALL VARIABLES BEFORE USING THEM DOUBLE PRECISION XIN !THE ARRAY FROM WHICH THE INPUTS TO THIS TYPE WILL BE RETRIEVED DOUBLE PRECISION OUT !THE ARRAY WHICH WILL BE USED TO STORE THE OUTPUTS FROM THIS TYPE DOUBLE PRECISION TIME !THE CURRENT SIMULATION TIME - YOU MAY USE THIS VARIABLE BUT DO NOT SET IT! DOUBLE PRECISION PAR !THE ARRAY FROM WHICH THE PARAMETERS FOR THIS TYPE WILL BE RETRIEVED DOUBLE PRECISION STORED !THE STORAGE ARRAY FOR HOLDING VARIABLES FROM TIMESTEP TO TIMESTEP DOUBLE PRECISION T !AN ARRAY CONTAINING THE RESULTS FROM THE DIFFERENTIAL EQUATION SOLVER DOUBLE PRECISION DTDT !AN ARRAY CONTAINING THE DERIVATIVES TO BE PASSED TO THE DIFF.EQ. SOLVER INTEGER*4 INFO(15) !THE INFO ARRAY STORES AND PASSES VALUABLE INFORMATION TO AND FROM THIS TYPE INTEGER*4 NP,NI,NOUT,ND !VARIABLES FOR THE MAXIMUM NUMBER OF PARAMETERS,INPUTS,OUTPUTS AND DERIVATIVES INTEGER*4 NPAR,NIN,NDER !VARIABLES FOR THE CORRECT NUMBER OF PARAMETERS,INPUTS,OUTPUTS AND DERIVATIVES INTEGER*4 IUNIT,ITYPE !THE UNIT NUMBER AND TYPE NUMBER FOR THIS COMPONENT INTEGER*4 ICNTRL !AN ARRAY FOR HOLDING VALUES OF CONTROL FUNCTIONS WITH THE NEW SOLVER INTEGER*4 NSTORED !THE NUMBER OF VARIABLES THAT WILL BE PASSED INTO AND OUT OF STORAGE CHARACTER*3 OCHECK !AN ARRAY TO BE FILLED WITH THE CORRECT VARIABLE TYPES FOR THE OUTPUTS CHARACTER*3 YCHECK !AN ARRAY TO BE FILLED WITH THE CORRECT VARIABLE TYPES FOR THE INPUTS C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C USER DECLARATIONS - SET THE MAXIMUM NUMBER OF PARAMETERS (NP), INPUTS (NI), C OUTPUTS (NOUT), AND DERIVATIVES (ND) THAT MAY BE SUPPLIED FOR THIS TYPE PARAMETER (NP=9,NI=4,NOUT=4,ND=0,NSTORED=4) C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C REQUIRED TRNSYS DIMENSIONS DIMENSION XIN(NI),OUT(NOUT),PAR(NP),YCHECK(NI),OCHECK(NOUT), 1 STORED(NSTORED),T(ND),DTDT(ND) INTEGER NITEMS C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C ADD DECLARATIONS AND DEFINITIONS FOR THE USER-VARIABLES HERE C PARAMETERS DOUBLE PRECISION TSETFIX DOUBLE PRECISION XMFRN DOUBLE PRECISION DTEMPN DOUBLE PRECISION DTMAX DOUBLE PRECISION HYST DOUBLE PRECISION RESAMB DOUBLE PRECISION RESWTR DOUBLE PRECISION CVLV DOUBLE PRECISION AVLV DOUBLE PRECISION EPS C INPUTS DOUBLE PRECISION TSU DOUBLE PRECISION TAMB DOUBLE PRECISION GAMMA DOUBLE PRECISION TSET DOUBLE PRECISION ATVLV DOUBLE PRECISION ADTEMP DOUBLE PRECISION AXMFR DOUBLE PRECISION ATSET DOUBLE PRECISION TWTR DOUBLE PRECISION TVLV DOUBLE PRECISION XMFRW DOUBLE PRECISION A DOUBLE PRECISION B DOUBLE PRECISION D DOUBLE PRECISION STEP DOUBLE PRECISION DTEMP DOUBLE PRECISION DTEMP1 DOUBLE PRECISION DTEMP2 DOUBLE PRECISION DMFR C----------------------------------------------------------------------------------------------------------------------- C READ IN THE VALUES OF THE PARAMETERS IN SEQUENTIAL ORDER TSETFIX=PAR(1) XMFRN=PAR(2) DTEMPN=PAR(3) DTMAX=PAR(4) HYST=PAR(5) RESAMB=PAR(6) RESWTR=PAR(7) CVLV=PAR(8) AVLV=PAR(9) C----------------------------------------------------------------------------------------------------------------------- C RETRIEVE THE CURRENT VALUES OF THE INPUTS TO THIS MODEL FROM THE XIN ARRAY IN SEQUENTIAL ORDER TSU=XIN(1) TAMB=XIN(2) GAMMA=XIN(3) TSET=XIN(4) IUNIT=INFO(1) ITYPE=INFO(2) C----------------------------------------------------------------------------------------------------------------------- C SET THE VERSION INFORMATION FOR TRNSYS IF(INFO(7).EQ.-2) THEN INFO(12)=16 RETURN 1 ENDIF C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C DO ALL THE VERY LAST CALL OF THE SIMULATION MANIPULATIONS HERE IF (INFO(8).EQ.-1) THEN RETURN 1 ENDIF C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C PERFORM ANY 'AFTER-ITERATION' MANIPULATIONS THAT ARE REQUIRED HERE C e.g. save variables to storage array for the next timestep IF (INFO(13).GT.0) THEN NITEMS=4 STORED(1)=TVLV STORED(2)=DTEMP STORED(3)=XMFRW STORED(4)=TSET CALL setStorageVars(STORED,NITEMS,INFO) RETURN 1 ENDIF C C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C DO ALL THE VERY FIRST CALL OF THE SIMULATION MANIPULATIONS HERE IF (INFO(7).EQ.-1) THEN C SET SOME INFO ARRAY VARIABLES TO TELL THE TRNSYS ENGINE HOW THIS TYPE IS TO WORK INFO(6)=NOUT INFO(9)=1 INFO(10)=0 !STORAGE FOR VERSION 16 HAS BEEN CHANGED C SET THE REQUIRED NUMBER OF INPUTS, PARAMETERS AND DERIVATIVES THAT THE USER SHOULD SUPPLY IN THE INPUT FILE C IN SOME CASES, THE NUMBER OF VARIABLES MAY DEPEND ON THE VALUE OF PARAMETERS TO THIS MODEL.... NIN=NI NPAR=NP NDER=ND C CALL THE TYPE CHECK SUBROUTINE TO COMPARE WHAT THIS COMPONENT REQUIRES TO WHAT IS SUPPLIED IN C THE TRNSYS INPUT FILE CALL TYPECK(1,INFO,NIN,NPAR,NDER) C SET THE NUMBER OF STORAGE SPOTS NEEDED FOR THIS COMPONENT NITEMS=4 CALL setStorageSize(NITEMS,INFO) C RETURN TO THE CALLING PROGRAM RETURN 1 ENDIF C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C DO ALL OF THE INITIAL TIMESTEP MANIPULATIONS HERE - THERE ARE NO ITERATIONS AT THE INTIAL TIME IF (TIME .LT. (getSimulationStartTime() + . getSimulationTimeStep()/2.D0)) THEN C SET THE UNIT NUMBER FOR FUTURE CALLS IUNIT=INFO(1) ITYPE=INFO(2) C CHECK THE PARAMETERS FOR PROBLEMS AND RETURN FROM THE SUBROUTINE IF AN ERROR IS FOUND C IF(...) CALL TYPECK(-4,INFO,0,"BAD PARAMETER #",0) C PERFORM ANY REQUIRED CALCULATIONS TO SET THE INITIAL VALUES OF THE OUTPUTS HERE C flow OUT(1)=100 EPS=0.001 STEP=getSimulationTimeStep() C PERFORM ANY REQUIRED CALCULATIONS TO SET THE INITIAL STORAGE VARIABLES HERE TWTR = TSU TVLV = (RESAMB*TWTR+RESWTR*TAMB)/(RESAMB+RESWTR) ATVLV = TVLV ADTEMP = TSETFIX - TVLV AXMFR=XMFRN NITEMS=4 ATSET=TSETFIX STORED(1)=ATVLV STORED(2)=ADTEMP STORED(3)=AXMFR STORED(4)=ATSET C PUT THE STORED ARRAY IN THE GLOBAL STORED ARRAY CALL setStorageVars(STORED,NITEMS,INFO) C RETURN TO THE CALLING PROGRAM RETURN 1 ENDIF C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C *** ITS AN ITERATIVE CALL TO THIS COMPONENT *** C----------------------------------------------------------------------------------------------------------------------- 33 NITEMS=4 CALL getStorageVars(STORED,NITEMS,INFO) ATVLV = STORED(1) ADTEMP = STORED(2) AXMFR = STORED(3) ATSET = STORED(4) C 1. CALCULATION OF THE TEMPERATURE OF THE VALVE MSR01480 C RESWTR TVLV RESAMB MSR01490 C O---VVV---O---VVV---O MSR01500 C | | | MSR01510 C TWTR ___ CVLV ___ ___TAMB MSR01520 C - ___ - MSR01530 C | | | MSR01540 C / / / MSR01550 C A. IF ONE OF THE CAPACITANCE OR RESISTANCES IS NIL MSR01560 IF (CVLV.EQ.0) THEN MSR01570 TVLV = (RESAMB*TWTR+RESWTR*TAMB)/(RESAMB+RESWTR) MSR01580 ELSE IF(RESWTR.EQ.0) THEN MSR01590 A =1/CVLV/RESAMB MSR01600 B = TAMB/CVLV/RESAMB MSR01610 D = ATVLV - B/A MSR01620 TVLV = D*EXP(-A*STEP)+B/A MSR01630 ELSE IF(RESAMB.EQ.0) THEN MSR01640 A =1/CVLV/RESWTR MSR01650 B = TWTR/CVLV/RESWTR MSR01660 D = ATVLV - B/A MSR01670 TVLV = D*EXP(-A*STEP)+B/A MSR01680 C B. CAPACITANCE AND RESISTANCES ARE NOT NIL MSR01690 ELSE MSR01700 A = (RESWTR+RESAMB)/CVLV/RESAMB/RESWTR MSR01710 B = (RESAMB*TWTR+RESWTR*TAMB)/CVLV/RESAMB/RESWTR MSR01720 D = ATVLV - B/A MSR01730 TVLV = D*EXP(-A*STEP)+B/A MSR01740 ENDIF MSR01750 C 2. CALCULATION OF THE DIFFERENCE BETWEEN THE VALVE AND THE SET MSR01760 C POINT, TAKING INTO ACCOUNT THE HYSTERESIS MSR01770 IF (HYST.EQ.0) THEN MSR01780 DTEMP = TSET - TVLV MSR01790 GOTO 10 MSR01800 ENDIF MSR01810 DTEMP1 = TSET - TVLV MSR01820 DTEMP2 = DTEMP1 - HYST MSR01830 IF(TVLV.GT.ATVLV) THEN MSR01840 IF(DTEMP1.GE.ADTEMP) THEN MSR01850 DTEMP = ADTEMP MSR01860 ELSE MSR01870 DTEMP = DTEMP1 MSR01880 ENDIF MSR01890 ELSE IF(TVLV.LT.ATVLV) THEN MSR01900 IF(DTEMP2.LE.ADTEMP) THEN MSR01910 DTEMP = ADTEMP MSR01920 ELSE MSR01930 DTEMP = DTEMP2 MSR01940 ENDIF MSR01950 ELSE MSR01960 DTEMP = ADTEMP MSR01970 ENDIF MSR01980 10 IF(DTEMP.GT.DTMAX) DTEMP = DTMAX MSR01990 IF(DTEMP.LT.0) DTEMP = 0 MSR02000 C 3. CALCULATION OF THE MASSFLOW RATE MSR02010 XMFRW = XMFRN*DTEMP/DTEMPN*(AVLV+(DTEMP/DTEMPN)**2*(1-AVLV)) MSR02020 +**(-0.5) MSR02030 IF (XMFRW.NE.0) THEN MSR02180 DMFR=(XMFRW-AXMFR)/XMFRW MSR02190 ELSE MSR02200 IF (AXMFR.EQ.0) THEN MSR02210 DMFR=0 MSR02220 ELSE MSR02230 DMFR=AXMFR MSR02240 ENDIF MSR02250 ENDIF MSR02260 IF (XMFRW.LT.0) XMFRW = 0 DMFR=ABS(DMFR) MSR02270 100 NITEMS=4 STORED(1)=TVLV STORED(2)=DTEMP STORED(3)=XMFRW STORED(4)=TSET CALL setStorageVars(STORED,NITEMS,INFO) IF (DMFR.GE.EPS ) GOTO 33 MSR02290 C----------------------------------------------------------------------------------------------------------------------- C REPORT ANY PROBLEMS THAT HAVE BEEN FOUND USING CALLS LIKE THIS: C CALL MESSAGES(-1,'put your message here','MESSAGE',IUNIT,ITYPE) C CALL MESSAGES(-1,'put your message here','WARNING',IUNIT,ITYPE) C CALL MESSAGES(-1,'put your message here','SEVERE',IUNIT,ITYPE) C CALL MESSAGES(-1,'put your message here','FATAL',IUNIT,ITYPE) C----------------------------------------------------------------------------------------------------------------------- C----------------------------------------------------------------------------------------------------------------------- C SET THE OUTPUTS FROM THIS MODEL IN SEQUENTIAL ORDER AND GET OUT C flow OUT(1)=XMFRW OUT(2)=TVLV OUT(3)=TSET OUT(4)=DTEMP C----------------------------------------------------------------------------------------------------------------------- C EVERYTHING IS DONE - RETURN FROM THIS SUBROUTINE AND MOVE ON RETURN 1 END C-----------------------------------------------------------------------------------------------------------------------