CONTINUOUS_MODEL MinMax ABSTRACT "Select MINimum or MAXimun of multiple input signals. An event is generated when selection is changed" EQUATIONS IF Selector < 0.5 THEN CALL FindMin(n_in,InSignal,n, Value) ELSE CALL FindMax(n_in,InSignal,n, Value) END_IF; OutSignal = Value; n_old := IF Eventn(G0, MIN((n+0.5) - n_old, n_old - (n-0.5))) < 0 THEN n ELSE n_old END_IF; LINKS /* type name variables... */ FOR i=1, n_in Generic InSignalLink[i] InSignal[i] END_FOR; FOR i=1, n_out Generic OutSignalLink[i] OutSignal; END_FOR; VARIABLES /* type name role def min max description */ Generic InSignal[n_in] IN 0 -BIG BIG "Insignals" Generic OutSignal OUT 0 -BIG BIG "Chosen min or max insignal" Generic Value LOC 0 -BIG BIG "Chosen min or max insignal use din subroutine call" Generic n LOC 1 1 BIG "Chosen number of insignal" Generic n_old A_S 1 1 BIG "Previous timesteps chosen number of insignal" Generic G0 A_S 1 -BIG BIG "Memory of chosen number of insignal" MODEL_PARAMETERS INT n_in SMP 2 1 BIGINT "number of input links" INT n_out SMP 1 1 BIGINT "number of output links" PARAMETERS Generic Selector S_P 0 0 1 "0=Min , 1 = Max" FUNCTION VOID FindMin(n_in, InSignal, n, MinValue) LANGUAGE F77 INPUT INT n_in; FLOAT InSignal[n_in]; OUTPUT FLOAT n, MinValue; CODE SUBROUTINE FindMin(n_in, InSignal, n, MinValue) INTEGER n_in, i DOUBLE PRECISION InSignal(n_in), MinValue, n MinValue = InSignal(1) n=DBLE(1) DO 100 i=2, n_in IF (MinValue .GT. InSignal(i)) THEN MinValue = InSignal(i) n = DBLE(i) ENDIF 100 CONTINUE END END_CODE END_FUNCTION FUNCTION VOID FindMax(n_in, InSignal, n, MaxValue) LANGUAGE F77 INPUT INT n_in; FLOAT InSignal[n_in]; OUTPUT FLOAT n, MaxValue; CODE SUBROUTINE FindMax(n_in, InSignal, n, MaxValue) INTEGER n_in, i DOUBLE PRECISION InSignal(n_in), MaxValue, n MaxValue = InSignal(1) n = DBLE(1) DO 100 i=2, n_in IF (MaxValue .LT. InSignal(i)) THEN MaxValue = InSignal(i) n = DBLE(i) ENDIF 100 CONTINUE END END_CODE END_FUNCTION END_MODEL