Computational routine
eng

##
minmax

### File content

    #include <math.h>
    #include "scicos_block.h"

    #ifndef min
    #define min(a,b) ((a) <= (b) ? (a) : (b))
    #endif

    #ifndef max
    #define max(a,b) ((a) >= (b) ? (a) : (b))
    #endif

    void minmax(scicos_block *block,int flag)
    { /*ipar[0]=1 -> min,  ipar[0]=2 -> max */

      int i,phase;
      double maxmin;
      phase=get_phase_simulation();
      if (flag == 1) {
        if(block->nin==1){
          if((block->ng==0)||(phase==1)){
    	maxmin=block->inptr[0][0];
    	for (i=1;i<block->insz[0];++i){
    	  if(block->ipar[0]==1){
    	    if(block->inptr[0][i]<maxmin)  maxmin=block->inptr[0][i];
    	  } else {
    	    if(block->inptr[0][i]>maxmin)  maxmin=block->inptr[0][i];
    	  }
    	}
          }else{
    	maxmin=block->inptr[0][block->mode[0]-1];
          }
          block->outptr[0][0]=maxmin;

        }else if (block->nin==2){
          for (i=0;i<block->insz[0];++i){
    	if((block->ng==0)||(phase==1)){
    	  if(block->ipar[0]==1){
    	    block->outptr[0][i]=min(block->inptr[0][i],block->inptr[1][i]);
    	  } else {
    	    block->outptr[0][i]=max(block->inptr[0][i],block->inptr[1][i]);
    	  }
    	}else{
    	  block->outptr[0][i]=block->inptr[block->mode[0]-1][i];
    	}
          }
        }
      } else if(flag == 9){
        if(block->nin==1){
          if(block->nin==1){
    	if (phase==2){
    	  for (i=0;i<block->insz[0];++i){
    	    if(i!=block->mode[0]-1){
    	      block->g[i]=block->inptr[0][i]-block->inptr[0][block->mode[0]-1];
    	    }else{
    	      block->g[i]=1.0;
    	    }
    	  }
    	} else if (phase==1){
    	  maxmin=block->inptr[0][0];
    	  for (i=1;i<block->insz[0];++i){
    	    block->mode[0]=1;
    	    if(block->ipar[0]==1){
    	      if(block->inptr[0][i]<maxmin) {
    		maxmin=block->inptr[0][i];
    		block->mode[0]=i+1;
    	      }
    	    } else {
    	      if(block->inptr[0][i]>maxmin) {
    		maxmin=block->inptr[0][i];
    		block->mode[0]=i+1;
    	      }
    	    }
    	  }
    	}
          }
        }else if(block->nin==2){
          for (i=0;i<block->insz[0];++i){
    	block->g[i]=block->inptr[0][i]-block->inptr[1][i];
    	if(phase==1){
    	  if(block->ipar[0]==1){
    	    if(block->g[i]>0) {
    	      block->mode[i]=2;
    	    }else{
    	      block->mode[i]=1;
    	    }
    	  }else{
    	    if(block->g[i]<0) {
    	      block->mode[i]=2;
    	    }else{
    	      block->mode[i]=1;
    	    }
    	  }
    	}
          }
        }
      }
    }