Let's work backwards. Ultimately we want something to multiply an HRRPUA with to get the the correct heat release for the burner. So we know we need a a surface with an HRRPUA and a RAMP to control the HRRPUA. But we want to explicitly control the value of that RAMP. One way to that is to have a linear RAMP.
&SURF ID='FIRE',HRRPUA=1000,RAMP_Q='FINAL FIRE RAMP'/
&RAMP ID='FINAL FIRE RAMP',T=0,F=0,CTRL_ID='CUSTOM_MULT_RAMP'/
&RAMP ID='FINAL FIRE RAMP',T=x,F=x/
here we want to set x to be large enough that the fire can grow big enough to operate the sprinkler but not so large that we wind up with bad resolution in the RAMP. By default FDS takes the T and F values and interpolates them to a 5000 row lookup table.
What do we need CUSTOM_RAMP_MULT to do? Either it gives the full fire size based on some growth curve, or it gives half that fire size if the sprinkler has gone off. That is it needs to output 1 or 0.5 depending on the state of the sprinkler activation. CUSTOM_RAMP_MULT is:
&CTRL ID='CUSTOM_RAMP_MULT',FUNCTION_TYPE='MULTIPLY',INPUT_ID='FIRE_RAMP','SPRINKLER_FACTOR'/
FIRE_RAMP is the size of the fire before adjusting for sprinklers. This is just a custom control function whose input is time and whose output is the fire that is frozen when the sprinkler operates:
&DEVC XYZ=x,y,z, QUANITITY='TIME', ID='FREEZE TIME', NO_UPDATE_CTRL_ID='SPR_ACT'/
&CTRL ID='FIRE_RAMP',FUNCTION_TYPE='CUSTOM',RAMP_ID='INT_RAMP',INPUT_ID='FREEZE TIME'/
&RAMP ID='INT_RAMP',T=0,F=0/
&RAMP ID='INT_RAMP',T=t1,F=f1/
&RAMP ID='INT_RAMP',T=t2,F=f2/
....
&RAMP ID='INT_RAMP',T=tn,F=fn/
where the ramp T and F values define whatever fire growth curve you want. This will give that fire growth until the sprinkler operates at which point the time is frozen and the ramp will just keep returning the same value.
SPRINKLER_FACTOR needs to return a 1 or 0.5 to multiply the output of FIRE_RAMP. One way to do this is to use the DEVC QUANTITY of CONTROL. This outputs 0 when a control function is false and 1 when it is true. With this we can have the final output of SPRINKER_FACTOR represent 1 - 0.5 * DEVC. When the sprinkler is off the DEVC is 0 and we get 1. When the sprinkler is on the DEVC is 1 and we get 0.5. So to get sprinkler factor we need a series of control functions:
&DEVC ID='SPRINKLER ON', QUANTITY='CONTROL', CTRL_ID='SPR_ACT'/
&CTRL ID='FACTOR_TERM',FUNCTION_TYPE='MULTIPLY',INPUT_ID='SPRINKLER ON','CONSTANT',CONSTANT=0.5/
&CTRL ID='SPRINKLER FACTOR',FUNCTION_TYPE='SUBTRACT',INPUT_ID='CONSTANT','FACTOR_TERM",CONSTANT=1/
Before the sprinkler operates:
-FREEZE_TIME is just the time
-INT_RAMP returns the current fire size
-SPRINKLER ON is 0 since SPR_ACT is false
-FACTOR_TERM is 0 (0*0.5=0)
-SPRINKLER_FACTOR is 1 (1-0=1)
-CUSTOM_RAMP_MULT is just the fire size (INT_RAMP * 1)
-FINAL FIRE RAMP just returns the same value as CUSTOM_RAMP_MULT
-The HRR at the surface is the normal fire growth size
At sprinkler operation:
-FREEZE_TIME is frozen at the current time
-INT_RAMP now returns the frozen HRR
-SPRINKLER ON is 1 since SPR_ACT is true
-FACTOR_TERM is 0.5 (1-1*0.5=0.5)
-CUSTOM_RAMP_MUL is now half the fire size (INT_RAMP*0.5)
-FINAL FIRE RAMP just returns the same value as CUSTOM_RAMP_MULT
-The HRR at the surface is the 1/2 the frozen heat release rate.
I haven't taken the time to make a case with all this and run it so it might need some tweaks, but I think this should point you in the right directions.