Skip to content

PRISM Common

The common/ directory contains all backend-independent modules shared by the CPU and FNL backends of PRISM. Every type described here is aggregated into prism_common_object, which serves as the base type for both backends.

Source Layout

FileModuleDescription
adam_prism_parameters.F90adam_prism_parametersPhysical constants, eigenvalue and eigenvector matrices
adam_prism_physics_object.F90adam_prism_physics_objectPhysical model selection, variable counts, eigenvector dispatch
adam_prism_numerics_object.F90adam_prism_numerics_objectTemporal/spatial scheme selection, divergence correction config
adam_prism_common_object.F90adam_prism_common_objectBase aggregate type for all backends
adam_prism_bc_object.F90adam_prism_bc_objectBoundary conditions handler
adam_prism_ic_object.F90adam_prism_ic_objectInitial conditions handler
adam_prism_io_object.F90adam_prism_io_objectI/O configuration and output routines
adam_prism_time_object.F90adam_prism_time_objectTime integration control
adam_prism_coil_object.F90adam_prism_coil_objectCurrent-carrying coil current density sources
adam_prism_fWLayer_object.F90adam_prism_fWLayer_objectFar-wave absorbing boundary layer
adam_prism_external_fields_object.F90adam_prism_external_fields_objectExternally prescribed electromagnetic fields
adam_prism_rk_bc_object.F90adam_prism_rk_bc_objectRK sub-step integrator for boundary conditions
adam_prism_pic_object.F90adam_prism_pic_objectParticle-in-Cell configuration and particle-grid weighting
adam_prism_particle_injection_object.F90adam_prism_particle_injection_objectInitial particle space and velocity distribution
adam_prism_leapfrog_pic_object.F90adam_prism_leapfrog_pic_objectLeapfrog (Boris) PIC particle time integrator
adam_prism_rk_pic_object.F90adam_prism_rk_pic_objectRunge-Kutta PIC particle time integrator
adam_prism_riemann_library.F90adam_prism_riemann_libraryMaxwell Riemann solvers (LLF, HLL) and convective flux routines
adam_prism_common_library.F90adam_prism_common_libraryBarrel re-export of all common modules

adam_prism_parameters — Physical Constants

Module-level parameters (all save):

ConstantValueDescription
NV_MAX11Maximum supported variable count (static array sizing)
MU01.256637e-6Vacuum magnetic permeability (H/m)
EPS08.854187e-12Vacuum permittivity (F/m)
C01/√(MU0·EPS0)Vacuum speed of light (m/s)
E_CHARGE-1.6e-19Electron charge (C)
E_MASS9.11e-31Electron mass (kg)
K_B1.380649e-23Boltzmann constant (J/K)
PI3.141592653589793π

Derived constants: MU0_SQ = √MU0, MU0_SQ_I2 = 1/(2√MU0), EPS0_SQ = √EPS0, EPS0_SQ_I2 = 1/(2√EPS0).

Eigensystem Arrays

The Maxwell system has wave speeds ±c0 and two degenerate zero speeds. The module provides target arrays used by prism_physics_object to set eigenvector pointers:

SymbolShapeDescription
EV(6)[0, 0, c0, c0, −c0, −c0]Eigenvalues of the 6-variable system
ER(6,6,3)real, targetRight eigenvectors for x, y, z directions
EL(6,6,3)real, targetLeft eigenvectors for x, y, z directions
IEV(6)all onesIdentity eigenvalues (conservative reconstruction)
IERL(6,6,3)identityIdentity right/left eigenvectors (conservative)
IEV_D(7), IERL_D(7,7,3)7-variableWith D divergence-cleaning scalar φ
IEV_B(7), IERL_B(7,7,3)7-variableWith B divergence-cleaning scalar ψ
IEV_D_B(8), IERL_D_B(8,8,3)8-variableWith both φ and ψ

adam_prism_physics_object — Physical Model

The prism_physics_object reads the physical model from the [physics] INI section and assembles the variable layout and eigensystem pointers.

INI Keys ([physics])

KeyValuesDescription
physical_modelelectromagnetic / PICSelect EM or Particle-in-Cell model
chireal > 0Divergence-cleaning propagation speed coefficient (hyperbolic only); evmax = chi · c₀

Accepted aliases for electromagnetic: Maxwell, EM, em, maxwell. For PIC: pic, ParticleInCell.

Data Members

MemberDefaultDescription
physical_modelSelected model string
nv_c6Conservative variable count (D, B — grows by nv_cl)
nv_s3Source variable count (J, always zero flux)
nv_cl0Divergence-cleaning variable count (0, 1, or 2)
nv_pic0PIC charge density variable count (0 or 1)
nvnv_c + nv_s + nv_cl + nv_picTotal variable count
var_Jx/Jy/Jz7/8/9 (no cleaning)Q-vector indices of J components; shift with cleaning
chi0Cleaning speed coefficient
evmaxc₀ or chi·c₀Maximum eigenvalue (maximum signal speed)
erw, elwpointerRight/left eigenvectors for WENO characteristic reconstruction

Variable Index Constants

fortran
VAR_DX = 1,  VAR_DY = 2,  VAR_DZ = 3
VAR_BX = 4,  VAR_BY = 5,  VAR_BZ = 6
! J indices shift depending on cleaning: var_Jx = 7, 8, or 9

Eigenvector Dispatch

At initialize, the pointers erw and elw are set based on the combination of reconstruction_vars and div_corr_var:

reconstruction_varsDiv correctionerw / elw
CONSERVATIVEanyIERL / IERL_D / IERL_B / IERL_D_B (identity)
CHARACTERISTICSnone / POISSONER(6,6,3) / EL(6,6,3)
CHARACTERISTICSHYPERBOLIC, D onlyER_D(7,7,3) / EL_D(7,7,3)
CHARACTERISTICSHYPERBOLIC, B onlyER_B(7,7,3) / EL_B(7,7,3)
CHARACTERISTICSHYPERBOLIC, D+BER_D_B(8,8,3) / EL_D_B(8,8,3)

For hyperbolic divergence cleaning the enlarged eigensystem uses the cleaning speed ch = chi·c₀: eigenvalues include 0, ±ch, ±c₀.


adam_prism_numerics_object — Numerical Schemes

Configured from the [numerics] INI section.

INI Keys ([numerics])

KeyValuesDescription
scheme_timeRUNGE_KUTTA / LEAPFROG / BLANES_MOAN / COMMUTATOR_FREE_MAGNUSTemporal integration scheme
scheme_spaceWENO / FD_CENTERED / FV_CENTEREDSpatial discretisation scheme
fdv_orderintegerOrder of centered FD/FV schemes
reconstruction_variablesCONSERVATIVE / CHARACTERISTICSWENO reconstruction basis
constrained_transportNO / D / B / DBEnable Constrained Transport on D and/or B
divergence_correctionPOISSON / HYPERBOLICDivergence error control strategy (absent = none)

The half-stencil width is derived as fdv_half_stencil = fdv_order / 2. Per-derivative stencil widths in fdv_half_stencils(6) are incremented progressively for higher-order derivatives.


adam_prism_common_object — Base Aggregate Type

prism_common_object aggregates every framework and PRISM sub-object and owns all simulation field arrays. Both backends (prism_cpu_object, prism_fnl_object) extend this type.

Data Members

Framework objects:

MemberTypeDescription
mpihmpih_objectMPI handler
adamadam_objectTop-level ADAM framework handle
fieldfield_object pointerField storage and metrics
gridgrid_object pointerGrid geometry
amramr_objectAMR marker handler
ibib_objectImmersed Boundary handler
slicesslices_objectSlice output handler
leapfrogleapfrog_objectLeapfrog field integrator
blanesmoanblanesmoan_objectBlanes-Moan field integrator
cfmcfm_objectCommutator-Free Magnus integrator
rkrk_objectRunge-Kutta field integrator
wenoweno_objectWENO reconstructor
flailflail_objectLinear algebra methods (Poisson solver)

PRISM sub-objects:

MemberTypeDescription
ioprism_io_objectI/O configuration
numericsprism_numerics_objectScheme selection
physicsprism_physics_objectPhysical model and variable layout
icprism_ic_objectInitial conditions
bcprism_bc_objectBoundary conditions
rk_bcprism_rk_bc_objectRK sub-step BC integrator
timeprism_time_objectTime control
fWLayerprism_fWLayer_objectFar-wave absorbing layer
coilprism_coil_objectCoil current density sources
external_fieldsprism_external_fields_objectPrescribed external fields
picprism_pic_objectPIC configuration and weighting
particle_injectionprism_particle_injection_objectInitial particle distribution
leapfrog_picprism_leapfrog_pic_objectLeapfrog PIC integrator
rk_picprism_rk_pic_objectRK PIC integrator

Convenience pointers (bound to field/physics members at init):

ngc, ni, nj, nk, nb, blocks_number, nv, nv_c, nv_s, nv_cl

Field arrays (allocated in allocate_common):

ArrayShapeDescription
q(nv, 1-ngc:ni+ngc, …, nb)Conservative state vector (D, B, J, ±φ/ψ, ±ρ)
dqsame as qResidual right-hand side
curlsame as qCurl of field components (optional output)
divergencesame as qDivergence of field components (optional output)
q_pic(8, particle_number)PIC particle state (PIC model only)
pic_fields(8, particle_number)Field values at particle locations (PIC model only)

Energy diagnostics:

MemberDescription
energy_D(:)Time history of electric field energy
energy_B(:)Time history of magnetic field energy
rms_energy_error_D/BRMS relative energy error

initialize_common Sequence

The 34-step initialization sequence called by both backends:

  1. mpih%initialize — MPI setup
  2. io%initialize(filename) — load and parse INI file
  3. bc%initialize — read boundary condition types
  4. numerics%initialize — read scheme selections and divergence correction
  5. physics%initialize — configure physical model and eigensystem (uses numerics outputs)
  6. adam%grid%initialize — initialize grid from INI (with BC type array)
  7. adam%compute_blocks_number — estimate blocks from available memory
  8. adam%initialize — allocate tree, maps, and field storage for nv variables
  9. Associate convenience pointers (field, grid, ngc, ni, …, nv_cl)
  10. pic%initialize — PIC configuration and particle count (PIC model only)
  11. particle_injection%initialize — particle distribution config (PIC model only)
  12. adam%refine_uniform — uniform mesh refinement to configured levels
  13. adam%prune — prune tree regions defined by ijkl_prune
  14. amr%initialize — AMR marker configuration
  15. field%compute_metrics — cell geometry and metrics
  16. time%initialize — read it_max, time_max, CFL
  17. ic%initialize — read initial conditions type and parameters
  18. fWLayer%initialize — compute far-wave layer damping function
  19. coil%initialize — compute coil current density fields
  20. ib%initialize — immersed boundary setup
  21. slices%initialize — slice output configuration
  22. external_fields%initialize — external field type and parameters
  23. rk%initialize — RK coefficients (if RUNGE_KUTTA)
  24. rk_bc%initialize — RK-BC stage arrays (if RUNGE_KUTTA)
  25. leapfrog%initialize — leapfrog weights (if LEAPFROG)
  26. blanesmoan%initialize — Blanes-Moan weights (if BLANES_MOAN)
  27. cfm%initialize — CFM weights (if COMMUTATOR_FREE_MAGNUS)
  28. weno%initialize — WENO stencil configuration (if WENO)
  29. leapfrog_pic%initialize — Boris leapfrog PIC (if PIC + LEAPFROG)
  30. rk_pic%initialize — RK PIC (if PIC + RUNGE_KUTTA)
  31. flail%initialize — linear algebra methods
  32. check_ngc_number — verify ngc ≥ weno%S and ngc ≥ fdv_half_stencil; stop on failure
  33. allocate_common — allocate dq, divergence, curl, and PIC arrays
  34. io_initialize — register auxiliary output fields with the I/O layer

io_initialize registers auxiliary fields conditionally:

ConditionRegistered fieldNames
io%save_residual_fieldsdqres_Dxres_Jzres_ph/res_ps/res_rh]
io%save_divergence_fieldsdivergencediv_D, div_B, div_J, fWL_x/y/z, …
coil%total_coils_number > 0coil%j_vec, coil%coil_flagj_vec_1/2/3, f_Gauss, coil_flag
io%save_curl_fieldscurlcurlD_x/y/z, curlB_x/y/z, curlJ_x/y/z

Methods

MethodDescription
allocate_commonAllocate dq, divergence, curl, and PIC arrays
initialize_commonFull 34-step initialization (called by backend initialize)
load_restart_filesLoad q and time from HDF5 restart files
save_energy_errorWrite energy error history if save frequency triggered
save_restart_filesSave HDF5 restart files and an XH5F snapshot
save_xh5fSave simulation data in XDMF+HDF5 format with variable names

adam_prism_bc_object — Boundary Conditions

Reads one BC type per face from six INI sections.

INI Sections

[bc_x_min], [bc_x_max], [bc_y_min], [bc_y_max], [bc_z_min], [bc_z_max]

Each section requires the key type:

type valueInteger constantDescription
extrapolationBC_EXTRAPOLATION = 1Zero-gradient extrapolation
NeumannBC_NEUMANN = 2Neumann (zero normal derivative)
DirichletBC_DIRICHLET = 3Dirichlet (prescribed field values)
Silver_MullerBC_Silver_Muller = 4Silver-Müller absorbing BC
periodicBC_PERIOD = 5Periodic
radiativeBC_radiative = 6Radiative (first-order absorbing)

The object stores bc_type(6) (integer codes) and q(9,6) (field values for Dirichlet BCs, one set per face).


adam_prism_ic_object — Initial Conditions

Configured from the [initial_conditions] INI section.

IC Types

type valueDescription
vacuumAll fields set to zero
riemann-problemPiecewise constant regions; each region in [initial_conditions_region_N]
plane_waveSinusoidal electromagnetic plane wave
rmf_fieldRotating Magnetic Field (reads from [external_fields])
uniform_fieldUniform background B and/or D
magnetic_nozzleMagnetic nozzle configuration (parameters TBD)
rmf_magnetic_nozzleCombined RMF + magnetic nozzle

INI Keys ([initial_conditions])

KeyDescription
amr_iterationsNumber of AMR iterations during IC application
typeIC type string (see table above)
regions_numberNumber of regions (Riemann problem only)
kx, ky, kzWave number direction cosines (plane wave)
lambdaWavelength (plane wave)
B0Background magnetic field amplitude (plane wave)
B_x, B_y, B_zUniform background B components

Region sections (riemann-problem): [initial_conditions_region_N] with keys Dx, Dy, Dz, Bx, By, Bz, Jx, Jy, Jz, emin_x/y/z, emax_x/y/z.


adam_prism_io_object — I/O Handler

Configured from the [IO] INI section.

INI Keys ([IO])

KeyDefaultDescription
output_basenamePrefix for all output files
it_save100Field output save frequency (iterations)
restart.false.Enable restart from existing files
restart_basenamePrefix for restart files
restart_save100Restart save frequency
residuals_save10Residuals log save frequency
save_memory_status.false.Log memory usage during allocations
save_residual_fields.false.Include dq in field output
save_curl_fields.false.Include curl field in output
save_divergence_fields.false.Include divergence field in output
save_gradient_fields.false.Include gradient field in output
save_laplacian_fields.false.Include Laplacian field in output

Output Files

FileColumnsTrigger
<basename>-energy_error.datit blocks time error_D error_B rms_D rms_BEvery energy_error_save iterations
<basename>-residuals.datit time blocks rq1 … rqNEvery residuals_save iterations

adam_prism_time_object — Time Handler

Configured from the [time] INI section.

INI Keys ([time])

KeyDefaultDescription
it_max-1Maximum iteration count (−1 = terminate by time)
time_max1.0Maximum physical time
CFL0.3CFL number for time-step control

Termination Logic (is_to_save)

ConditionMeaning
mod(it, it_save) == 0Periodic save
it == it_maxFinal iteration (when it_max > 0)
it_max ≤ 0 .and. time ≥ time_maxPhysical time limit reached
it_max > 0 .and. it ≥ it_maxIteration limit reached

print_progress prints it, time-step dt, current time, and a percentage completion based on whichever termination criterion is active.


adam_prism_coil_object — Coil Sources

Models current-carrying coils as volumetric current density J sources.

INI Section ([coils_input])

KeyValuesDescription
rectangular_coils_numberintegerNumber of rectangular coils
circular_coils_numberintegerNumber of circular coils

Per-coil configuration (section [coil_N]):

KeyValuesDescription
coil_typerectangular / circularLoop geometry
current_typeDC_current / AC_currentCurrent waveform
normal+x / -x / +y / -y / +z / -zCoil plane normal
ArealCurrent amplitude (A)
frealFrequency (Hz) — AC only
phaserealInitial phase (rad) — AC only
x_center, y_center, z_centerrealCoil centre coordinates
lx, lyrealRectangular loop dimensions
r_coilrealCircular loop radius
sigmarealGaussian current distribution width

Internal Arrays

ArrayShapeDescription
J_vec(total_coils_number, 4, ni, nj, nk, nb)Per-coil current density vector and Gaussian weight
coil_flag(ni, nj, nk, nb)Integer flag: which coil passes through each cell

J_vec(:,1:3,…) holds current density direction components; J_vec(:,4,…) holds the Gaussian distribution value f_Gauss.


adam_prism_fWLayer_object — Far-Wave Absorbing Layer

Implements a sponge-like damping layer at domain boundaries to absorb outgoing electromagnetic waves, following Barbas notation.

INI Section ([fWLayer])

KeyDescription
CLayer width in cells (0 = layer disabled)
layer_xm, layer_xp, …Boolean flags for each of the six sides (−x, +x, −y, +y, −z, +z)

Damping Function

The damping function f(3, ni, nj, nk, nb) is initialized once at startup. For a layer of width C cells:

fi={1150(7C2+255C+250)C<4025C40

The values decay smoothly from the interior (where f = 1) toward the boundary. The three components of f correspond to the x, y, z sides of the layer, enabling correct treatment of corner and edge regions.

The divergence array is initialized with fWLayer%f components at indices 4–6, making the layer damping coefficients available as output fields (fWL_x, fWL_y, fWL_z).


adam_prism_external_fields_object — External Fields

Prescribed electromagnetic fields added to (and subtracted from) the state vector around each time step.

INI Section ([external_fields])

KeyValuesDescription
ef_typeRMF / magnetic_nozzle / RMF_and_magnetic_nozzle / noneExternal field type
RMF_frequencyrealRotating magnetic field frequency (Hz)
RMF_B_amplituderealRotating magnetic field amplitude (T)
RMF_rotation_axisX / Y / ZRotation axis

At initialization, the add_external_fields and sub_external_fields procedure pointers are dispatched to the corresponding implementation (add_external_fields_rmf, etc.) based on ef_type.


adam_prism_rk_bc_object — RK-BC Integrator

Stores the per-stage boundary condition state during Runge-Kutta sub-stepping.

Data Members

MemberDescription
q_bc_rk(:,:,:,:,:,:)Per-stage BC field values
dq_bc_rk(:,:,:,:,:)Per-stage BC residuals
ark, brk, crkLow-storage RK coefficients
alph, beta, gammSSP RK coefficients
ssa, ssbSymplectic-splitting RK coefficients
nrkNumber of RK stages

Methods

MethodDescription
initializeMirror the parent rk_object coefficient set
initialize_stagesZero the stage arrays
assign_stageCopy current q to the stage buffer
compute_stageAdvance the BC state for one RK sub-step

adam_prism_pic_object — Particle-in-Cell

Manages macro-particle configuration, grid-particle mapping, and weighting.

INI Section ([PIC])

KeyValuesDescription
problem_typeplasma / single_particleSimulation scenario
plasma_densityrealInitial plasma number density (m⁻³) — plasma only
neutral_fractionrealFraction of neutral particles — plasma only
particle_weighting_modelCIC / NGP / TSCCharge deposition scheme
current_weighting_modelCIC / NGP / TSCCurrent deposition scheme
field_weighting_model0D / 1DField interpolation order at particle positions
scheme_timeLEAPFROG / RUNGE_KUTTAParticle time integrator

Particle Count

For plasma: particle_number = plasma_density × domain_volume. The population is split into ions, electrons, and neutrals according to neutral_fraction. For single_particle: particle_number = 1.

Weighting Models

SchemeMethodDescription
NGPNearest Grid PointParticle charge/current deposited to the containing cell only
CICCloud-in-CellTrilinear interpolation to 3×3×3 neighbourhood
TSCTriangular Shaped CloudQuadratic weight function over 3×3×3 neighbourhood

Field interpolation models:

ModelDescription
0DZero-order: field value at the nearest grid point
1DFirst-order: piecewise-linear field interpolation at particle position

At initialization, the three procedure pointers particle_weighting, current_weighting, and field_weighting are dispatched to the selected method implementations.

neighbour_list(4, particle_number)

Stores the current grid indices (block, i, j, k) for each particle, updated each time step by particle_cartesian_grid_index.


adam_prism_particle_injection_object — Particle Injection

Sets the initial spatial and velocity distributions for PIC particles.

INI Section ([particle_injection])

KeyValuesDescription
space_distributionUniform_domain_space_distribution / Uniform_boxes_space_distribution / Uniform_cell_space_distribution / Space_random_number_generator / Space_layered_number_generatorInitial spatial distribution
velocity_distributionUniform_Maxwellian / Non_uniform_Maxwellian / Velocity_random_number_generator / Velocity_layered_number_generatorInitial velocity distribution
T_i, T_e, T_nrealIon/electron/neutral temperature (uniform Maxwellian)
T_i_x/y/z, T_e_x/y/z, T_n_x/y/zrealPer-axis temperatures (non-uniform Maxwellian)
v_drift_x/y/zrealDrift velocity components
box_numberrealNumber of boxes for charge-neutral injection
space_pairinglogicalPair ions and electrons in space
velocity_pairinglogicalPair ion/electron velocities
v_av_correctionlogicalCorrect mean velocity after sampling
x_position, y_position, z_positionrealInitial position (single particle)
charge, massrealCharge and mass (single particle)

At initialization, the procedure pointers particle_space_injection and particle_velocity_injection are dispatched to the selected distribution subroutines.


adam_prism_leapfrog_pic_object — Leapfrog PIC Integrator

Implements the Boris leapfrog particle pusher, integrating particle equations of motion staggered in time relative to the field update. The Boris method is energy-conserving and second-order accurate for the Lorentz force equation.


adam_prism_rk_pic_object — Runge-Kutta PIC Integrator

Implements explicit Runge-Kutta time integration for PIC particle trajectories, sharing RK coefficients with the parent field integrator rk_object.


adam_prism_riemann_library — Riemann Solvers

Provides the Maxwell convective flux routines and Riemann solvers used in all spatial schemes.

Public Routines

RoutineDescription
compute_riemann_maxwell_llfLLF (Rusanov) solver
compute_riemann_maxwell_hllHLL (Harten–Lax–van Leer) solver (internal)
compute_convective_fluxes_maxwellBase flux for the 6-variable system
compute_convective_fluxes_maxwell_div_dFlux extended with D-cleaning scalar φ
compute_convective_fluxes_maxwell_div_bFlux extended with B-cleaning scalar ψ
compute_convective_fluxes_maxwell_div_d_bFlux with both φ and ψ
compute_eigenvalues_vectorMaximum wave speed for time-step control

LLF Solver

FLLF(qL,qR)=12[F(qL)+F(qR)c0(qRqL)]

applied to the 6 conservative variables (D, B). The J source variables have zero flux and are not passed through the Riemann solver.

HLL Solver

FHLL=λ+FLλFR+λ+λ(qRqL)λ+λ,λ+=c0,λ=c0

compute_convective_fluxes_interface

Abstract interface for flux routines, allowing procedure pointer dispatch in backend implementations:

fortran
subroutine compute_convective_fluxes_interface(sir, q, f, chi)
  real(R8P), intent(in)    :: sir(3)  ! directional unit increment (x, y, or z)
  real(R8P), intent(in)    :: q(1:)   ! state vector
  real(R8P), intent(inout) :: f(1:)   ! computed fluxes
  real(R8P), intent(in)    :: chi     ! divergence-cleaning speed coefficient
end subroutine

adam_prism_common_library — Barrel Re-export

A single convenience module that re-exports all 17 common modules. Both backends use only this one use statement:

fortran
use adam_prism_common_library

Modules re-exported: adam_prism_parameters, adam_prism_physics_object, adam_prism_numerics_object, adam_prism_common_object, adam_prism_bc_object, adam_prism_ic_object, adam_prism_io_object, adam_prism_time_object, adam_prism_coil_object, adam_prism_fWLayer_object, adam_prism_external_fields_object, adam_prism_rk_bc_object, adam_prism_pic_object, adam_prism_particle_injection_object, adam_prism_leapfrog_pic_object, adam_prism_rk_pic_object, adam_prism_riemann_library.


License

PRISM is part of the ADAM framework, released under the GNU Lesser General Public License v3.0 (LGPLv3).

Copyright (C) Andrea Di Mascio, Federico Negro, Giacomo Rossi, Francesco Salvadore, Stefano Zaghi.