示例#1
0
文件: ai.c 项目: DanIverson/OpenVnmrJ
static int dc()
/*********/
{
    float *spectrum;
    int   trace;      /* index of the current spectrum         */

    if(init2d(1,1)) ABORT;
    trace = currentindex();
    if (trace == 0) trace = 1;
    if ((spectrum=gettrace(trace-1,0)) == 0) ABORT;
    disp_status("DC      ");
    dodc(spectrum,1,c_block.head->lvl,c_block.head->tlt);
    disp_status("        ");
    P_setreal(CURRENT,"lvl",lvl,0);
    P_setreal(CURRENT,"tlt",tlt,0);
    return(rel_spec());
}
示例#2
0
文件: main.c 项目: samkos/ZEPHYRP
int main(int argc, char **argv){
  PetscErrorCode ierr;
  int nx = 63, ny = 63;
  DM dm;
  PetscBool flg;
  Mat A;
  Vec u, b;
  KSP solver;
  PC pc;
  double norm;
  PetscInt stage;

  ierr = PetscInitialize(&argc, &argv, NULL, NULL);CHKERRQ(ierr);
  
  ierr = PetscOptionsGetInt(PETSC_NULL, "-nx", &nx, PETSC_NULL);CHKERRQ(ierr);
  ierr = PetscOptionsGetInt(PETSC_NULL, "-ny", &ny, PETSC_NULL);CHKERRQ(ierr);
  ierr = PetscOptionsHasName(PETSC_NULL, "-assemble", &flg);CHKERRQ(ierr);

  ierr = PetscLogStageRegister("preparing",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);

 
  ierr = PetscLogStageRegister("Domain creation",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
  ierr = createDomain(&dm, nx, ny);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);

  ierr = PetscLogStageRegister("matrix creation",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
  ierr = createMat(dm, &A, flg);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);

  ierr = PetscLogStageRegister("Vector creation",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);
 
  ierr = DMCreateGlobalVector(dm, &b);CHKERRQ(ierr);
  ierr = VecDuplicate(b, &u);CHKERRQ(ierr);

  ierr = PetscLogStageRegister("Domain initialisation",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
  ierr = init2d(dm, b);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);

  ierr = PetscLogStageRegister("solver creation",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
  ierr = KSPCreate(PETSC_COMM_WORLD, &solver);CHKERRQ(ierr);
  ierr = KSPSetOptionsPrefix(solver, "poisson_");CHKERRQ(ierr);
  ierr = KSPSetOperators(solver, A, A, DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
  ierr = KSPSetType(solver, KSPCG);
  ierr = KSPGetPC(solver, &pc);CHKERRQ(ierr);
  ierr = PCSetType(pc, PCNONE);CHKERRQ(ierr);
  ierr = KSPSetFromOptions(solver);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);

  ierr = PetscLogStagePop();CHKERRQ(ierr);
  
  ierr = PetscLogStageRegister("Solving",&stage); CHKERRQ(ierr);
  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);

  ierr = KSPSolve(solver, b, u);CHKERRQ(ierr);
  ierr = PetscLogStagePop();CHKERRQ(ierr);

  //ierr = VecView(u, PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);
  //sleep(10);


  VecDestroy(&u);
  VecDestroy(&b);
  MatDestroy(&A);
  DMDestroy(&dm);
  KSPDestroy(&solver);
  ierr = PetscFinalize();
  return 0;
}
示例#3
0
int mark(int argc, char *argv[], int retc, char *retv[] )
{
	int	 firstarg, cmd_is_ds, mark_ret_val, num_num_args, reset_flag,
		 trace_flag;
	double	 mark_args[ 4 ];

/************************************************************************/
/*  Check for `reset' as a keyword.  Need to verify syntax.  Three	*/
/*  situations:  "reset" used improperly; "reset" used correctly;	*/
/*  no "reset" keyword.							*/
/************************************************************************/

	reset_flag = check_reset( argc, argv );
	if (reset_flag < 0)
	  ABORT;
	else if (reset_flag > 0) {
		if (do_mark_reset() == 0)
		  RETURN;
		else
		  ABORT;
	}

/************************************************************************/
/*  Check for `trace' as a keyword.  Situation is similar to `reset',	*/
/*  except there is no file name and the returned value distinguishes   */
/*  `trace' as first from `trace' as last argument (the only 2 choices) */
/************************************************************************/

	firstarg = 1;			/* Skip command name */
	trace_flag = check_trace( argc, argv );
	if (trace_flag < 0)
	  ABORT;
	if (trace_flag != 0) {
		if (retc > 2) {
			Werrprintf(
    "%s:  cannot return more than 2 values when using `trace' keyword", argv[ 0 ]
			);
			ABORT;
		}
		if (trace_flag == 1)	/* Skip over 1st argument */
		  firstarg = 2;		/* if it was `trace'	  */
		else			/* Otherwise it was the last */
		  argc--;		/* argument, so reduce total */
	}				/* number of arguments by 1  */

/************************************************************************/
/*  Extract numeric values, number of numeric values.  The `mark'	*/
/*  command accepts 0, 1, 2 or 4 such arguments.  If `num_vals_args'	*/
/*  returns -1, the subroutine has already posted an error message.	*/
/************************************************************************/

	num_num_args = num_vals_args( firstarg, argc, argv, &mark_args[ 0 ], 4 );
	if (num_num_args < 0)
	  ABORT;
	else if (num_num_args == 3 || num_num_args > 4) {
		Werrprintf( "%s:  incorrect number of numeric arguments", argv[ 0 ] );
		ABORT;
	}

/************************************************************************/
/*  Get the current graphics command to establish if DS was the last 	*/
/*  such command executed.  In that case, we perform a 1D operation	*/
/*  unless MARK was called with 4 numeric arguments.			*/
/*									*/
/*  Abort if current graphics command is not DS or DCONI.  Add checks	*/
/*  for other display commands (DCON, DPCON, etc.) here if required.	*/
/************************************************************************/

	cmd_is_ds = WgraphicsdisplayValid( "ds" );
	if ( !cmd_is_ds &&
	     !WgraphicsdisplayValid( "dconi" ) &&
	     num_num_args == 0 )
	{
		Werrprintf(
	    "%s:  requires arguments when no data displayed", argv[ 0 ]
		);
		ABORT;
	}

/************************************************************************/
/*  `init2d' subroutine defines `d2flag' and many other important	*/
/*  variables.  First argument instructs `init2d' to set "reverse"	*/
/*  flag if trace = "f1".  Second argument instructs `init2d' to	*/
/*  prepare chart variables for displaying data.			*/
/************************************************************************/

	if (init2d( 1, 1 ))
	  ABORT;

/************************************************************************/
/*  Now that `d2flag' is defined, check on 4 more error conditions:	*/
/*  A.  2D data is present, last command not `ds', 1 numeric argument	*/
/*      and no `trace' keyword.						*/
/*  B.  No 2D data present and 4 numeric arguments entered.		*/
/*  C.  No 2D data present and the `trace' keyword was used.		*/
/*  D.  No 2D data present and command returns more than 2 values.	*/
/************************************************************************/

	if (d2flag) {
		if (trace_flag == 0 && cmd_is_ds == 0 && num_num_args == 1) {
			Werrprintf(
    "%s:  'trace' keyword required with 2D data and 1 numeric argument", argv[ 0 ]
			);
			ABORT;
		}
	}
	else {					/* No 2D data */
		if (num_num_args == 4) {
			Werrprintf(
	    "%s:  Cannot have 4 numeric arguments with 1D data", argv[ 0 ]
			);
			ABORT;
		}
		if (trace_flag) {
			Werrprintf(
	    "%s:  Cannot use 'trace' keyword with 1D data", argv[ 0 ]
			);
			ABORT;
		}
		if (retc > 2) {
			Werrprintf(
	    "%s:  Cannot return more than 2 values with 1D data", argv[ 0 ]
			);
			ABORT;
		}
	}

/*  2D operations.  If 2D data is present and the `trace' keyword was
    NOT selected, then there were either 2 or 4 numeric arguments.	*/

	if (num_num_args == 4 || (d2flag && trace_flag == 0 && cmd_is_ds == 0)) {
		mark_ret_val = do_2d_mark(
			 retc, retv,
			 num_num_args,
			&mark_args[ 0 ]
		);
	}

/*  1D operations.  Come here if
    A.  num_num_args != 4 AND
    B.  d2flag is clear OR trace_flag is set OR cmd_is_ds is set.	*/

	else {
		mark_ret_val = do_1d_mark(
			 cmd_is_ds,
			 retc, retv,
			 num_num_args,
			&mark_args[ 0 ]
		);
	}

	if (mark_ret_val == 0)
	  RETURN;
	else
	  ABORT;
}
示例#4
0
文件: ddph.c 项目: timburrow/ovj3
int wrspec(int argc, char *argv[], int retc, char *retv[] )
{
	char		*cmd_name, *outfile_name;
	char		 ow_prompt[ MAXPATHL + 20 ], ow_ans[ 4 ];
	int		 elem1_num, elem2_num, elem3_num, elem4_num,
			 i, ival, np_out;
	int		 proctype; /* proctype for processing function type */
	float		*vdata, /* output data */
			 epscale = 0.0,
			 rms = 0.0;
	double		 swmagic, tmp;
	FILE		*tfile=NULL; 

/*	retv[0]=0 ok; retv[0]=1 failed */

        cmd_name = argv[ 0 ];
	if (argc < MINNEW_ARGS)		/* compare MAXNEW_ARGS in wrspec_args */
	{
                Werrprintf( "Usage:  %s( 'file_name' <, trace number > )", cmd_name);
        	if (retc>0) retv[0] = intString(1);
        	return( 0 );
        }
	outfile_name = argv[ WRFILE_ARG ];        /* address of (output) file name: argv[1] */

/* do avg_scale if asked for it */
	if (strcmp(outfile_name, "expl_avg_scale")==0) {
		if (argc < 3) {
        		if (retc>0) retv[0] = intString(1);
        		return( 0 );
			}
		if (calc_avg_scale( cmd_name, argv[2] ) != 0) {
			/* errors reported in function */
        		if (retc>0) retv[0] = intString(1);
        		return( 0 );
			}
        	if (retc>0) retv[0] = intString(0);
        	return( 0 );
		}

	init2d(1,1); /* get data headers */
	if ((datahead.status & S_SPEC) == 0)
		{
		Werrprintf("%s:  data must be ft'd first", cmd_name); 
        	if (retc>0) retv[0] = intString(1);
        	return( 0 );
		} 

	if (wrspec_args( argc, argv, &proctype, &elem1_num, &elem2_num, &elem3_num, &elem4_num ) != 0)
		{
        	if (retc>0) retv[0] = intString(1);
        	return( 0 );
		/* `writefid_args' reports error */  /* depends on argc */
		}
	EPRINT0(1,"calling wrspec...\n");
	EPRINT1(1,"  wrspec: proctype %d, ", proctype);
	EPRINT2(1,"trace numbers %d %d ",elem1_num,elem2_num);
	EPRINT2(1,"%d %d\n",elem3_num,elem4_num);

/*	if (proctype == 8) { outfile_name="ds"; for dmg; use outfile_name="dmg" and proctype=2?
		 } else { below; } */

        vdata=(float *)malloc((fn/2) * sizeof(float));
        if (!vdata) { 
		Werrprintf( "ddph: memory allocation failure" );
        	if (retc>0) retv[0] = intString(1);
        	return( 0 );
		}

	if ( strcmp( outfile_name, "ds") != 0) {

/*  Handle situation where the output file is already present.  */
        if (access( outfile_name, F_OK ) == 0) {
                if (!Bnmr) {
                        sprintf( &ow_prompt[ 0 ], "OK to overwrite %s? ", outfile_name);
                        W_getInputCR( &ow_prompt[ 0 ], &ow_ans[ 0 ], sizeof( ow_ans ) - 1);
                        if (ow_ans[ 0 ] != 'Y' && ow_ans[ 0 ] != 'y') {
        			free((char*) vdata);
                                Winfoprintf( "%s:  operation aborted", cmd_name );
        			if (retc>0) retv[0] = intString(1);
        			return( 0 );
                        }
                }
                ival = unlink( outfile_name );
                if (ival != 0) {
        		free((char*) vdata);
                        Werrprintf( "%s:  cannot remove %s", cmd_name, outfile_name );
        		if (retc>0) retv[0] = intString(1);
        		return( 0 );
                }
        }
        tfile = fopen( outfile_name, "w" );   /* open file */
        if (tfile == NULL) {
        	free((char*) vdata);
                Werrprintf( "%s:  problem opening %s", cmd_name, outfile_name );
                if (retc>0) retv[0] = intString(1);
                return( 0 );
                }
		} /* end "not ds" mode */

	if (proctype==2 || proctype==4 || proctype==5 || proctype==7) {
	if (wrspec_find_epscale( &epscale, proctype, elem1_num, elem2_num) != 0) {
		Werrprintf( "%s:  find epscale failed", cmd_name);
        	free((char*) vdata);
                if (retc>0) retv[0] = intString(1);
                return( 0 );
		}
		}

	if (proctype != 5) {
	if (wrspec_calcdata(cmd_name, proctype, elem1_num, elem2_num, elem3_num, elem4_num, vdata) != 0)
		{
        	free((char*) vdata);
                if (retc>0) retv[0] = intString(1);
                return( 0 );
		/* calcdata reports error */
		}
	if (wrspec_output( cmd_name, outfile_name, tfile, vdata, proctype, epscale, &rms) != 0)
		{
                if (retc>0) retv[0] = intString(1);
                return( 0 );
		/* write output to file or 'ds' */
		}
	}
	else { /* proctype == 5 */

	if ( (ival=P_getreal(CURRENT, "gzwin", &swmagic, 1)) ) {
		swmagic = 100.0;
		}
	else {
		if (swmagic < 0.0) swmagic =  -swmagic; 
		tmp = 100.0 * 1.0/((float) (fn/2-1));
		if (swmagic < tmp) swmagic = tmp; 
		if (swmagic > 100.0) swmagic = 100.0;
	}
        swmagic /= 100.0;
	np_out = fn/2 - 2 * (int) ((1.0 - ((float) swmagic)) * ((float) (fn/4)) );

	ival = ((datahead.nblocks + 1) / 2) - 2; /* ival is gzsize, number of z shims */

	if ( epscale < NEW_AMP_TOL ) {
		fprintf( tfile, "exp 4\n  %d  %d\nFrequency (hz) vs Phase\n", 
			ival, np_out );
			}
		else {
		fprintf( tfile, "exp 4\n  %d  %d\nFrequency (hz) vs Field (hz)\n",
			ival, np_out ); 
			}
	for (i=0; i<ival; i++) {
	    fprintf( tfile, "\n%d  0  0  0\n", i+1 );
	    elem3_num = 2 * i + 3;
	    elem4_num = 2 * i + 4;
	    if (wrspec_calcdata(cmd_name, 4, elem1_num, elem2_num, elem3_num, elem4_num, vdata) != 0)
		{
                if (retc>0) retv[0] = intString(1);
                return( 0 );
		/* calcdata reports error; use proctype=4 */
		}
	    rms = (float) elem3_num;
	    if (wrspec_output( cmd_name, outfile_name, tfile, vdata, proctype, epscale, &rms) != 0)
		{
                if (retc>0) retv[0] = intString(1);
                return( 0 );
		/* write output to file or 'ds' */
		}
	}

	}

	if (strcmp( outfile_name, "ds") != 0)   fclose( tfile ); 
	free((char*) vdata);

	if (retc>0) retv[0] = intString(0);
	if (retc>1) retv[1] = realString( ((double)rms) );

	EPRINT0(1,"wrspec done!\n");
	return( 0 );
}