* * $Id: munomi.F,v 1.1.1.1 1996/04/01 15:02:55 mclareni Exp $ * * $Log: munomi.F,v $ * Revision 1.1.1.1 1996/04/01 15:02:55 mclareni * Mathlib gen * * #include "gen/pilot.h" SUBROUTINE MUNOMI(NCH,NTOT,P,N,IERROR) C C MULTINOMIAL GENERATOR C CODED FROM LOS ALAMOS REPORT LA-5061-MS C PROB(N(1),...,N(NCH))=FACT(NTOT)*(PRODUCT ON I OF(P(I)**N(I)/FACT(N C WHERE FACT(N) STANDS FOR FACTORIAL OF N C ON INPUT NCH NUMBER OF CHANNELS C NTOT SUM OF N(I) C P(I) , I=1,NCH LIST OF INDIVIDUAL PROBABILITIES C THIS LIST IS ALTERED AFTER FIRST CALL TO REPRESENT C DISTRIBUTION FUNCTIO TO SAVE TIME ON FURTHER CALLS C WITH IDENTICAL REQUESTS C SUM OF P(I),I=1,J-1 OVERWRITES P(J) C ALTERNATIVELY ONE MAY ENTER DIRECTLY THIS ALTERED C LIST BUT P(NCH) MUST BE .EQ.1. C RETURNS N(I) , I=1,NCH C IERROR.EQ.0 NORMALLY C IERROR.EQ.1 IF AT LEAST ONE P IS NEGATIVE C IERROR.EQ.2 IF SUM OF P(I) IS LARGER THAN 1. C DIMENSION P(2),N(2) C CHECKING/PREPARATION IS DONE IN PRINCIPLE ONCE IF(P(NCH).EQ.1.) GO TO 200 C CHECK INPUT PROBABILITIES IF(P(1).LT.0.) GO TO 800 DO 150 I=2,NCH IF(P(I).LT.0.) GO TO 800 C PREPARE DISTRIBUTION FUNCTION P(I)=P(I)+P(I-1) 150 CONTINUE C CHECK OVERALL SUM IF(P(NCH).GT.1.) GO TO 900 C SET SUM EXACTLY EQUAL TO 1. , WILL BE RECOGNISED ON FURTHER CALLS P(NCH)=1. 200 CONTINUE IERROR=0 CALL UZERO(N,1,NCH) DO 350 I=1,NTOT R=RNDM(I) DO 250 J=1,NCH IF(P(J).LT.R) GO TO 250 K=J GO TO 300 250 CONTINUE C ONE SHOULD NOT REACH THIS PLACE K=NCH 300 CONTINUE N(K)=N(K)+1 350 CONTINUE GO TO 999 800 CONTINUE C AT LEAST ONE NEGATIVE PROBABILITY IERROR=1 GO TO 999 900 CONTINUE C SUM OF PROBABILITIES IS LARGER THAN 1. IERROR=2 999 CONTINUE RETURN END