Stupid me, I don't know my own code.

   You can use PetscSynchronizedFGets() exactly for this purpose.

    Barry

   I have updated the manual page for PetscFOpen() to seealso:
PetscSynchronizedFGets()


On Fri, 12 May 2006, Barry Smith wrote:

>
>  Joshua,
>
>    PetscFOpen() only produces a valid fd on process 0. Thus fgets()
> can only be used on process 0. It is crashing on process 1 because
> fd is garbage there.
>
>    You need to MPI_Scatter the data to the other processes. There is
> no PetscFGets(), though come to think of it there should be! I will write
> one and send it to you.
>
>   Barry
>
>
>
> On Thu, 11 May 2006, Joshua Adelman wrote:
>
>> I am trying to read some parameters into my PETSc simulation using fgets, 
>> and am getting a strange error. It appears that fgets and sscanf are 
>> working since the proper values are read into the simulation, but it throws 
>> an error anyways. This problem only arises when I am using the parallel 
>> version of the code (i.e. setting -n in mpiexec to a value greater than 1). 
>> Basically if I comment everything out and then start uncommenting one line 
>> at a time, the error appears once I've uncommented the line with fgets. One 
>> strange thing to note is that the error happens after the program has 
>> already finished executing the function where the problem is. Here's a 
>> snippet of the code that seems to be causing the problem:
>> 
>> PetscErrorCode DataReadParams(SimData *sdata) {
>>      int                     rank, size;
>>      PetscErrorCode  ierr;
>>      int                             i;
>>      FILE                    *fd;
>>      char            str[256];
>>      char                    line[100];
>>      int                             max = 100;
>>              PetscFunctionBegin;
>>
>>      ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size); CHKERRQ(ierr);
>>      ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank); CHKERRQ(ierr);
>>
>>              /* Read data from files */
>>      sprintf(str,"%s%s",sdata->simname,".param");
>>      ierr = PetscFOpen(PETSC_COMM_WORLD,str,"r",&fd); CHKERRQ(ierr);
>>      if (!rank && !fd) {
>>          SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open %s\n",str);
>>      }
>>      // PetscPrintf(PETSC_COMM_WORLD,"Opening file %s\n",str);
>>      fgets(line,max,fd);
>>      sscanf(line,"%d",&sdata->NP);
>> 
>> The error that is kicked out is:
>> 
>> 
>> [1]PETSC ERROR: Caught signal number 10 BUS: Bus Error, possibly illegal 
>> memory access
>> [1]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger
>> [1]PETSC ERROR: or try http://valgrind.org on linux to find memory 
>> corruption errors
>> [1]PETSC ERROR: likely location of problem given in stack below
>> [1]PETSC ERROR: --------------- Stack Frames ---------------
>> [1]PETSC ERROR: Note: The EXACT line numbers in the stack are not 
>> available,
>> [1]PETSC ERROR:       INSTEAD the line number of the start of the function
>> [1]PETSC ERROR:       is given.
>> [1]PETSC ERROR: [1] DataReadParams line 23 datareadparams.c
>> [1]PETSC ERROR: [1] SimInit line 19 siminit.c
>> [1]PETSC ERROR: --------------------------------------------
>> [1]PETSC ERROR: User provided function() line 0 in unknown directory 
>> unknown file
>> [1]PETSC ERROR: Signal received!
>> [1]PETSC ERROR:  !
>> 
>> 
>> Any insight would be most appreciated.
>> 
>> Josh
>>
>> 
>> ------------------------------------------------------------------------------------------------------
>> Joshua L. Adelman
>> Biophysics Graduate Group              Lab: 510.643.2159
>> 218 Wellman Hall                                Fax: 510.642.7428
>> University of California, Berkeley 
>> http://www.ocf.berkeley.edu/~jadelman
>> Berkeley, CA 94720 USA                   jadelman at ocf.berkeley.edu
>> 
>> ------------------------------------------------------------------------------------------------------
>> 
>> 
>> 
>


Reply via email to