diff options
Diffstat (limited to 'lpic/src/stack.C')
-rw-r--r-- | lpic/src/stack.C | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/lpic/src/stack.C b/lpic/src/stack.C new file mode 100644 index 0000000..ad56073 --- /dev/null +++ b/lpic/src/stack.C @@ -0,0 +1,105 @@ +/* + This file is part of LPIC++, a particle-in-cell code for + simulating the interaction of laser light with plasma. + + Copyright (C) 1994-1997 Roland Lichters + + LPIC++ is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <stack.h> + +////////////////////////////////////////////////////////////////////////////////////////// + +stack::stack( parameter &p ) +{ + sprintf( errname, "%s/error-%d", p.path, p.domain_number ); + static error_handler bob("stack::Constructor", errname ); + + zero = new stack_member; + hole = new stack_member; + + zero->next = hole; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void stack::put_on_stack( struct cell *new_cell, struct particle *part ) +{ + static error_handler bob("stack::put_on_stack", errname); + + stack_member *new_member; + + new_member = new stack_member; + if (!new_member) bob.error( "allocation error" ); + + new_member->part = part; + new_member->new_cell = new_cell; + + new_member->next = zero->next; + zero->next = new_member; + +#ifdef DEBUG + if ( (TINY < new_cell->x - part->x) || (part->x - new_cell->next->x > TINY) ) { + bob.message( "particle on stack for wrong cell" ); + bob.message( "part->x = ", part->x ); + bob.message( "new_cell->x-part->x = ", new_cell->x-part->x ); + bob.message( "new_cell->x = ", new_cell->x ); + bob.message( "new_cell->next->x = ", new_cell->next->x ); + bob.error( "part->x-new_cell->next->x = ", part->x-new_cell->next->x ); + } +#endif + if (part->x < new_cell->x) part->x = new_cell->x; + if (part->x > new_cell->next->x) part->x = new_cell->next->x; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void stack::remove_from_stack( stack_member *member ) +{ + zero->next = member->next; + delete member; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void stack::insert_particle( struct cell *new_cell, struct particle *part ) +{ + if (part->prev!=NULL) part->prev->next = part->next; // extract particle from old chain + else part->cell->first = part->next; + if (part->next!=NULL) part->next->prev = part->prev; + else part->cell->last = part->prev; + + if (part->cell->insert == part) part->cell->insert = part->next; // new insert mark!! + + part->prev = NULL; // insert particle into the new chain + part->next = new_cell->first; + new_cell->first = part; + if (part->next==NULL) new_cell->last = part; + else part->next->prev = part; + + part->cell->np[ part->species ] --; + part->cell->npart --; + new_cell->np[ part->species ] ++; + new_cell->npart ++; + + part->cell = new_cell; +} + + + + +////////////////////////////////////////////////////////////////////////////////////////// +//eof |