From 04c7be10c993f39902a0768c7a82469e65248e87 Mon Sep 17 00:00:00 2001 From: alice grosch <a.grosch@fz-juelich.de> Date: Thu, 1 Oct 2020 14:19:59 +0200 Subject: [PATCH] Create base image --- CatalystEnabledSimulation/coprocessor.py | 88 -- CatalystEnabledSimulation/cpscript.py | 93 -- CatalystEnabledSimulation/fedatastructures.py | 44 - CatalystEnabledSimulation/fedriver.py | 47 - Dockerfile | 13 +- data/waveletElevation.vti | Bin 75276 -> 0 bytes data/waveletMaterial.vti | 1346 ----------------- files/pv_server.py | 58 - notebooks/basic_usage.ipynb | 396 ----- notebooks/catalyst.ipynb | 383 ----- notebooks/custom_protocol.ipynb | 109 -- notebooks/large_dataset.ipynb | 577 ------- notebooks/minimal_example.ipynb | 157 -- 13 files changed, 1 insertion(+), 3310 deletions(-) delete mode 100644 CatalystEnabledSimulation/coprocessor.py delete mode 100644 CatalystEnabledSimulation/cpscript.py delete mode 100644 CatalystEnabledSimulation/fedatastructures.py delete mode 100644 CatalystEnabledSimulation/fedriver.py delete mode 100644 data/waveletElevation.vti delete mode 100644 data/waveletMaterial.vti delete mode 100644 files/pv_server.py delete mode 100644 notebooks/basic_usage.ipynb delete mode 100644 notebooks/catalyst.ipynb delete mode 100644 notebooks/custom_protocol.ipynb delete mode 100644 notebooks/large_dataset.ipynb delete mode 100644 notebooks/minimal_example.ipynb diff --git a/CatalystEnabledSimulation/coprocessor.py b/CatalystEnabledSimulation/coprocessor.py deleted file mode 100644 index c8c5d07..0000000 --- a/CatalystEnabledSimulation/coprocessor.py +++ /dev/null @@ -1,88 +0,0 @@ -coProcessor = None - -def initialize(): - global coProcessor - import paraview - from vtk import vtkParallelCore - import paraview.servermanager as pvsm - import vtk - from mpi4py import MPI - import os, sys - - paraview.options.batch = True - paraview.options.symmetric = True - from paraview.modules import vtkRemotingServerManager as CorePython - from paraview.modules.vtkRemotingApplication import vtkInitializationHelper - - if not pvsm.vtkProcessModule.GetProcessModule(): - pvoptions = None - if paraview.options.batch: - pvoptions = CorePython.vtkPVOptions(); - pvoptions.SetProcessType(CorePython.vtkPVOptions.PVBATCH) - if paraview.options.symmetric: - pvoptions.SetSymmetricMPIMode(True) - vtkInitializationHelper.Initialize(sys.executable, pvsm.vtkProcessModule.PROCESS_BATCH, pvoptions) - - - # we need ParaView 4.2 since ParaView 4.1 doesn't properly wrap - # vtkPVPythonCatalyst - if pvsm.vtkSMProxyManager.GetVersionMajor() < 4 or (pvsm.vtkSMProxyManager.GetVersionMajor() == 4 and pvsm.vtkSMProxyManager.GetVersionMinor() < 2): - print('Must use ParaView v4.2 or greater') - sys.exit(0) - - import numpy - from paraview.modules import vtkPVCatalyst as catalyst - from paraview.modules import vtkPVPythonCatalyst as pythoncatalyst - import paraview.simple - import paraview.vtk as vtk - from paraview.vtk.util import numpy_support - paraview.options.batch = True - paraview.options.symmetric = True - - coProcessor = catalyst.vtkCPProcessor() - pm = paraview.servermanager.vtkProcessModule.GetProcessModule() - from mpi4py import MPI - -def finalize(): - global coProcessor - coProcessor.Finalize() - # if we are running through Python we need to finalize extra stuff - # to avoid memory leak messages. - import sys, ntpath - if ntpath.basename(sys.executable) == 'python': - from paraview.modules.vtkRemotingApplication import vtkInitializationHelper - vtkInitializationHelper.Finalize() - -def addscript(name): - global coProcessor - from paraview.modules import vtkPVPythonCatalyst as pythoncatalyst - pipeline = pythoncatalyst.vtkCPPythonScriptPipeline() - pipeline.Initialize(name) - coProcessor.AddPipeline(pipeline) - -def coprocess(time, timeStep, grid, attributes): - global coProcessor - import vtk - from paraview.modules import vtkPVCatalyst as catalyst - import paraview - from paraview.vtk.util import numpy_support - dataDescription = catalyst.vtkCPDataDescription() - dataDescription.SetTimeData(time, timeStep) - dataDescription.AddInput("input") - - if coProcessor.RequestDataDescription(dataDescription): - import fedatastructures - imageData = vtk.vtkImageData() - imageData.SetExtent(grid.XStartPoint, grid.XEndPoint, 0, grid.NumberOfYPoints-1, 0, grid.NumberOfZPoints-1) - imageData.SetSpacing(grid.Spacing) - - velocity = numpy_support.numpy_to_vtk(attributes.Velocity) - velocity.SetName("velocity") - imageData.GetPointData().AddArray(velocity) - - pressure = numpy_support.numpy_to_vtk(attributes.Pressure) - pressure.SetName("pressure") - imageData.GetCellData().AddArray(pressure) - dataDescription.GetInputDescriptionByName("input").SetGrid(imageData) - dataDescription.GetInputDescriptionByName("input").SetWholeExtent(0, grid.NumberOfGlobalXPoints-1, 0, grid.NumberOfYPoints-1, 0, grid.NumberOfZPoints-1) - coProcessor.CoProcess(dataDescription) diff --git a/CatalystEnabledSimulation/cpscript.py b/CatalystEnabledSimulation/cpscript.py deleted file mode 100644 index b115bf4..0000000 --- a/CatalystEnabledSimulation/cpscript.py +++ /dev/null @@ -1,93 +0,0 @@ -from paraview.simple import * -from paraview import coprocessing - -#-------------------------------------------------------------- -# Code generated from cpstate.py to create the CoProcessor. - - -# ----------------------- CoProcessor definition ----------------------- - -def CreateCoProcessor(): - def _CreatePipeline(coprocessor, datadescription): - class Pipeline: - filename_6_pvti = coprocessor.CreateProducer( datadescription, "input" ) - - # create a new 'Parallel ImageData Writer' - imageDataWriter1 = servermanager.writers.XMLPImageDataWriter(Input=filename_6_pvti) - - # register the writer with coprocessor - # and provide it with information such as the filename to use, - # how frequently to write the data, etc. - coprocessor.RegisterWriter(imageDataWriter1, filename="fullgrid_%t.pvti", freq=10000) - - Slice1 = Slice( Input=filename_6_pvti, guiName="Slice1", Crinkleslice=0, SliceOffsetValues=[0.0], Triangulatetheslice=1, SliceType="Plane" ) - Slice1.SliceType.Offset = 0.0 - Slice1.SliceType.Origin = [9.0, 11.0, 9.0] - Slice1.SliceType.Normal = [1.0, 0.0, 0.0] - - # create a new 'Parallel PolyData Writer' - parallelPolyDataWriter1 = servermanager.writers.XMLPPolyDataWriter(Input=Slice1) - - # register the writer with coprocessor - # and provide it with information such as the filename to use, - # how frequently to write the data, etc. - coprocessor.RegisterWriter(parallelPolyDataWriter1, filename='slice_%t.pvtp', freq=1000) - - return Pipeline() - - class CoProcessor(coprocessing.CoProcessor): - def CreatePipeline(self, datadescription): - self.Pipeline = _CreatePipeline(self, datadescription) - - coprocessor = CoProcessor() - freqs = {'input': [10, 100]} - coprocessor.SetUpdateFrequencies(freqs) - return coprocessor - -#-------------------------------------------------------------- -# Global variables that will hold the pipeline for each timestep -# Creating the CoProcessor object, doesn't actually create the ParaView pipeline. -# It will be automatically setup when coprocessor.UpdateProducers() is called the -# first time. -coprocessor = CreateCoProcessor() - -#-------------------------------------------------------------- -# Enable Live-Visualizaton with ParaView -coprocessor.EnableLiveVisualization(True, 1) - - -# ---------------------- Data Selection method ---------------------- - -def RequestDataDescription(datadescription): - "Callback to populate the request for current timestep" - global coprocessor - if datadescription.GetForceOutput() == True: - # We are just going to request all fields and meshes from the simulation - # code/adaptor. - for i in range(datadescription.GetNumberOfInputDescriptions()): - datadescription.GetInputDescription(i).AllFieldsOn() - datadescription.GetInputDescription(i).GenerateMeshOn() - return - - # setup requests for all inputs based on the requirements of the - # pipeline. - coprocessor.LoadRequestedData(datadescription) - -# ------------------------ Processing method ------------------------ - -def DoCoProcessing(datadescription): - "Callback to do co-processing for current timestep" - global coprocessor - - # Update the coprocessor by providing it the newly generated simulation data. - # If the pipeline hasn't been setup yet, this will setup the pipeline. - coprocessor.UpdateProducers(datadescription) - - # Write output data, if appropriate. - coprocessor.WriteData(datadescription); - - # Write image capture (Last arg: rescale lookup table), if appropriate. - coprocessor.WriteImages(datadescription, rescale_lookuptable=False) - - # Live Visualization, if enabled. - coprocessor.DoLiveVisualization(datadescription, "localhost", 22222) diff --git a/CatalystEnabledSimulation/fedatastructures.py b/CatalystEnabledSimulation/fedatastructures.py deleted file mode 100644 index b4b2424..0000000 --- a/CatalystEnabledSimulation/fedatastructures.py +++ /dev/null @@ -1,44 +0,0 @@ -import numpy - -class GridClass: - """ - We are working with a uniform grid which will be - represented as a vtkImageData in Catalyst. It is partitioned - in the x-direction only. - """ - def __init__(self, pointDimensions, spacing): - from mpi4py import MPI - comm = MPI.COMM_WORLD - rank = comm.Get_rank() - size = comm.Get_size() - - self.XStartPoint = int(pointDimensions[0]*rank/size) - self.XEndPoint = int(pointDimensions[0]*(rank+1)/size) - if rank+1 != size: - self.XEndPoint += 1 - else: - self.XEndPoint = pointDimensions[0]-1 - self.NumberOfYPoints = pointDimensions[1] - self.NumberOfZPoints = pointDimensions[2] - self.NumberOfGlobalXPoints = pointDimensions[0] - - self.PointDimensions = pointDimensions - self.Spacing = spacing - - def GetNumberOfPoints(self): - return (self.XEndPoint-self.XStartPoint+1)*self.PointDimensions[1]*self.PointDimensions[2] - - def GetNumberOfCells(self): - return (self.XEndPoint-self.XStartPoint)*(self.PointDimensions[1]-1)*(self.PointDimensions[2]-1) - -class AttributesClass: - """ - We have velocity point data and pressure cell data. - """ - def __init__(self, grid): - self.Grid = grid - - def Update(self, time): - self.Velocity = numpy.zeros((self.Grid.GetNumberOfPoints(), 3)) - self.Velocity = self.Velocity + time - self.Pressure = numpy.random.rand(self.Grid.GetNumberOfCells()) diff --git a/CatalystEnabledSimulation/fedriver.py b/CatalystEnabledSimulation/fedriver.py deleted file mode 100644 index 78deb07..0000000 --- a/CatalystEnabledSimulation/fedriver.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -A simple example of a Python simulation code working with Catalyst. -It depends on numpy and mpi4py being available. The environment -variables need to be set up properly to find Catalyst when running directly -from python. For Linux -and Mac machines they should be: -export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:<Catalyst build dir>/lib -export PYTHONPATH=<Catalyst build dir>/lib:<Catalyst build dir>/lib/site-packages - -Alternatively, pvbatch or pvpython can be used which will automatically set up -system paths for using Catalyst. - -When running, Catalyst scripts must be added in on the command line. For example: -</path/to/pvpython> fedriver.py cpscript.py -mpirun -np 4 </path/to/pvbatch> -sym fedriver.py cpscript.py -""" -from time import sleep - -import numpy -import sys -from mpi4py import MPI - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() - -import fedatastructures - -grid = fedatastructures.GridClass([5, 6, 5], [4, 4, 4]) -attributes = fedatastructures.AttributesClass(grid) -doCoprocessing = True - -if doCoprocessing: - import coprocessor - coprocessor.initialize() - for i in sys.argv[1:]: - if rank == 0: - print('Using Catalyst script', i) - coprocessor.addscript(i) - -for i in range(10000): - sleep(0.5) - attributes.Update(i) - if doCoprocessing: - coprocessor.coprocess(i, i, grid, attributes) - -if doCoprocessing: - coprocessor.finalize() diff --git a/Dockerfile b/Dockerfile index 4f493cf..8ebcb58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -138,15 +138,4 @@ RUN pip install jupyter-server-proxy \ && npm cache clean --force \ && rm -rf $CONDA_DIR/share/jupyter/lab/staging \ && rm -rf /home/$NB_USER/.cache/yarn \ - && rm -rf /home/$NB_USER/.node-gyp \ - && mkdir logs - -ENV JUPYTER_LOG_DIR "/home/jovyan/work/logs" - -COPY --chown=$NB_UID:$NB_GID notebooks/*.ipynb /home/$NB_USER/work/ -COPY --chown=$NB_UID:$NB_GID files/pv_server.py /home/$NB_USER/work/ -COPY --chown=$NB_UID:$NB_GID data /home/$NB_USER/work/data -COPY --chown=$NB_UID:$NB_GID CatalystEnabledSimulation /home/$NB_USER/work/CatalystEnabledSimulation - -# Turn off warnings in Python 3.8 -ENV PYTHONWARNINGS "ignore" + && rm -rf /home/$NB_USER/.node-gyp diff --git a/data/waveletElevation.vti b/data/waveletElevation.vti deleted file mode 100644 index e5544635914944fe21a254e82e88db72bf36da76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75276 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 Dn1;ap diff --git a/data/waveletMaterial.vti b/data/waveletMaterial.vti deleted file mode 100644 index 010518c..0000000 --- a/data/waveletMaterial.vti +++ /dev/null @@ -1,1346 +0,0 @@ -<VTKFile type="ImageData" version="1.0" byte_order="LittleEndian" header_type="UInt64"> - <ImageData WholeExtent="-10 10 -10 10 -10 10" Origin="0 0 0" Spacing="1 1 1"> - <Piece Extent="-10 10 -10 10 -10 10"> - <PointData> - </PointData> - <CellData Scalars="Material"> - <DataArray type="Float64" Name="Material" format="ascii" RangeMin="0" RangeMax="5"> - 5 5 5 5 5 5 - 5 5 5 4 4 4 - 4 4 4 3 3 3 - 3 3 5 5 5 5 - 5 5 5 5 4 4 - 4 4 4 4 3 3 - 3 3 3 3 5 5 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 5 5 5 5 5 5 - 5 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 5 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 5 5 - 5 5 5 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 5 5 5 5 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 5 5 5 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 5 4 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 4 3 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 5 5 - 5 5 5 5 5 5 - 5 4 4 4 4 4 - 4 3 3 3 3 3 - 5 5 5 5 5 5 - 5 5 4 4 4 4 - 4 4 3 3 3 3 - 3 3 5 5 5 5 - 5 5 5 4 4 4 - 4 4 4 4 3 3 - 3 3 3 2 5 5 - 5 5 5 5 5 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 5 5 - 5 5 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 2 2 - 5 5 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 5 4 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 1 - 4 4 4 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 4 3 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 5 5 5 5 - 5 5 5 5 4 4 - 4 4 4 4 3 3 - 3 3 3 3 5 5 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 5 5 5 5 5 5 - 5 4 4 4 4 4 - 4 4 3 3 3 3 - 3 2 5 5 5 5 - 5 5 5 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 5 5 - 5 5 5 5 4 4 - 4 4 4 4 4 3 - 3 3 3 3 2 2 - 5 5 5 5 5 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 5 5 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 4 4 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 1 4 4 - 4 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 3 3 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 5 5 5 5 5 5 - 5 5 4 4 4 4 - 4 4 3 3 3 3 - 3 3 5 5 5 5 - 5 5 5 4 4 4 - 4 4 4 4 3 3 - 3 3 3 2 5 5 - 5 5 5 5 5 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 5 5 - 5 5 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 5 5 5 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 5 4 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 4 4 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 2 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 5 5 - 5 5 5 5 5 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 5 5 5 5 5 5 - 5 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 5 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 5 5 - 5 5 5 5 4 4 - 4 4 4 4 4 3 - 3 3 3 3 2 2 - 5 5 5 5 5 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 5 5 - 4 4 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 2 2 - 4 4 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 1 - 4 3 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 2 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 5 5 5 5 - 5 5 5 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 5 5 - 5 5 5 5 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 5 5 - 5 5 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 5 5 5 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 5 4 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 1 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 3 3 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 5 5 5 5 5 5 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 5 5 5 5 - 5 5 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 5 5 - 5 5 5 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 5 5 5 5 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 5 5 5 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 5 5 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 4 4 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 1 - 4 4 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 0 5 5 - 5 5 5 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 5 5 5 5 5 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 5 5 5 5 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 5 5 - 5 4 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 2 2 2 - 5 5 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 4 4 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 1 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 5 5 5 5 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 5 5 - 5 5 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 5 5 5 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 5 5 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 2 2 2 4 4 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 1 4 4 - 4 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 1 - 4 3 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 0 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 0 0 - 5 5 5 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 2 - 2 2 5 5 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 5 4 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 4 4 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 4 4 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 0 0 5 4 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 4 4 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 2 2 - 2 2 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 2 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 4 4 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 2 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 0 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 0 0 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 0 - 0 0 4 4 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 4 4 - 4 4 4 4 4 4 - 4 3 3 3 3 3 - 3 3 2 2 2 2 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 1 - 4 4 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 3 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 0 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 1 0 0 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 4 4 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 4 4 4 4 - 4 4 4 4 3 3 - 3 3 3 3 3 2 - 2 2 2 2 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 4 4 - 4 4 4 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 4 4 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 3 3 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 0 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 0 0 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 4 4 - 4 4 4 4 4 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 4 4 4 4 4 4 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 4 4 4 4 - 4 4 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 4 4 - 4 4 4 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 4 3 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 3 3 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 3 3 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 0 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 0 0 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 0 0 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 0 0 4 4 4 4 - 4 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 4 4 - 4 4 4 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 4 4 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 3 3 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 1 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 3 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 0 0 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 0 0 - 4 4 4 4 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 4 4 4 3 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 1 4 4 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 4 3 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 3 3 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 0 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 0 0 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 0 - 0 0 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 1 0 0 0 0 0 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 0 0 2 1 1 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 0 0 0 0 4 3 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 3 3 3 3 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 1 1 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 0 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 0 0 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 0 0 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 0 0 2 2 2 1 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 0 0 2 1 - 1 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 0 0 - 1 1 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 0 0 - 0 0 3 3 3 3 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 1 1 3 3 - 3 3 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 1 1 1 - 3 3 3 3 3 3 - 3 3 3 2 2 2 - 2 2 2 2 2 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 3 3 3 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 2 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 0 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 0 0 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 0 0 - 2 1 1 1 1 1 - 1 1 1 1 1 1 - 1 0 0 0 0 0 - 0 0 1 1 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 0 0 0 0 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 0 0 0 0 0 0 - 3 3 3 3 3 3 - 3 3 2 2 2 2 - 2 2 2 2 1 1 - 1 1 3 3 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 1 1 1 1 3 3 - 3 3 3 3 3 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 3 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 3 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 0 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 0 0 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 1 - 1 0 0 0 0 0 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 0 0 1 1 1 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 0 0 0 0 1 1 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 0 0 0 0 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 0 0 0 0 - 0 0 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 0 0 - 0 0 0 0 3 3 - 3 3 3 3 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 3 3 3 3 3 3 - 2 2 2 2 2 2 - 2 2 2 1 1 1 - 1 1 3 3 3 3 - 3 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 3 3 - 3 3 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 3 3 3 2 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 3 3 2 2 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 2 2 - 2 2 2 2 2 2 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 2 2 2 2 2 2 - 2 2 2 2 2 1 - 1 1 1 1 1 1 - 1 1 2 2 2 2 - 2 2 2 2 2 2 - 1 1 1 1 1 1 - 1 1 1 0 2 2 - 2 2 2 2 2 2 - 2 1 1 1 1 1 - 1 1 1 1 0 0 - 2 2 2 2 2 2 - 2 2 1 1 1 1 - 1 1 1 1 1 0 - 0 0 2 2 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 2 2 - 2 2 2 1 1 1 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 2 2 2 2 1 1 - 1 1 1 1 1 1 - 1 1 1 0 0 0 - 0 0 2 2 1 1 - 1 1 1 1 1 1 - 1 1 1 1 0 0 - 0 0 0 0 1 1 - 1 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 0 0 - 1 1 1 1 1 1 - 1 1 1 1 1 0 - 0 0 0 0 0 0 - 0 0 1 1 1 1 - 1 1 1 1 1 1 - 0 0 0 0 0 0 - 0 0 0 0 1 1 - 1 1 1 1 1 1 - 1 0 0 0 0 0 - 0 0 0 0 0 0 - 1 1 1 1 1 1 - 1 1 0 0 0 0 - 0 0 0 0 0 0 - 0 0 - </DataArray> - </CellData> - </Piece> - </ImageData> -</VTKFile> diff --git a/files/pv_server.py b/files/pv_server.py deleted file mode 100644 index 01fd358..0000000 --- a/files/pv_server.py +++ /dev/null @@ -1,58 +0,0 @@ -# import to process args -import os - -# import paraview modules. -from paraview.web import pv_wslink -from paraview.web import protocols as pv_protocols - -from paraview import simple -from wslink import server - -try: - import argparse -except ImportError: - # since Python 2.6 and earlier don't have argparse, we simply provide - # the source for the same as _argparse and we use it instead. - from vtk.util import _argparse as argparse - -# ============================================================================= -# Create custom PVServerProtocol class to handle clients requests -# ============================================================================= - -class _DemoServer(pv_wslink.PVServerProtocol): - authKey = "wslink-secret" - def initialize(self): - # Bring used components - self.registerVtkWebProtocol(pv_protocols.ParaViewWebMouseHandler()) - self.registerVtkWebProtocol(pv_protocols.ParaViewWebViewPort()) - self.registerVtkWebProtocol(pv_protocols.ParaViewWebViewPortImageDelivery()) - self.updateSecret(_DemoServer.authKey) - - # Disable interactor-based render calls - simple.GetRenderView().EnableRenderOnInteraction = 0 - simple.GetRenderView().Background = [0,0,0] - cone = simple.Cone() - simple.Show(cone) - simple.Render() - - # Update interaction mode - pxm = simple.servermanager.ProxyManager() - interactionProxy = pxm.GetProxy('settings', 'RenderViewInteractionSettings') - interactionProxy.Camera3DManipulators = ['Rotate', 'Pan', 'Zoom', 'Pan', 'Roll', 'Pan', 'Zoom', 'Rotate', 'Zoom'] - -# ============================================================================= -# Main: Parse args and start server -# ============================================================================= - -if __name__ == "__main__": - # Create argument parser - parser = argparse.ArgumentParser(description="ParaViewWeb Demo") - - # Add default arguments - server.add_arguments(parser) - - # Extract arguments - args = parser.parse_args() - - # Start server - server.start_webserver(options=args, protocol=_DemoServer) \ No newline at end of file diff --git a/notebooks/basic_usage.ipynb b/notebooks/basic_usage.ipynb deleted file mode 100644 index 1878334..0000000 --- a/notebooks/basic_usage.ipynb +++ /dev/null @@ -1,396 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img src=\"https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/raw/JupyterCon2020/img/logo.png\"\n", - " style=\"float:right; width:25%; height:25%; margin-top:25px;\">\n", - "\n", - "# Jupyter for interactive In-Situ Visualization with ParaView/Catalyst\n", - "\n", - "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.version.fz-juelich.de%2Fgrosch1%2Fpvlink_demo_for_jupytercon/JupyterCon2020) \n", - "Try out the *pvlink* extension and the example notebooks in binder." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Behind the Scenes\n", - "\n", - "To checkout how *pvlink* works and what happens behind the scenes, [click here](https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/blob/JupyterCon2020/BehindTheScenes.md)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Basic Usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> If you are trying this notebook out on Binder, you need to use [jupyter server proxy](#Using-jupyter-server-proxy)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SimpleRenderer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Start a ParaViewWeb server on the command line, for example using the code from the [official ParaView example](https://kitware.github.io/paraviewweb/examples/RemoteRenderer.html#Using-ParaView-as-server)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%script bash --bg\n", - "pvpython pv_server.py --port 1234 --authKey wslink-secret" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can then connect to the ParaViewWeb Server using a `SimpleRenderer`, passing the session URL and the authentication key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pvlink import SimpleRenderer\n", - "\n", - "simple = SimpleRenderer(sessionURL='ws://localhost:1234/ws', authKey='wslink-secret')\n", - "display(simple)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> If you are trying this notebook out on Binder, you need to use [jupyter server proxy](#Using-jupyter-server-proxy)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that in this setup, it is not possible to change the content to be rendered from within the notebook. The content is determined only at the start of the ParaViewWeb server." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RemoteRenderer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Most likely you *do* want to be able to make changes to the displayed source. In this case you should use the `RemoteRenderer`, which handles the ParaViewWeb server for you. You can still pass all arguments of the webserver as python arguments, in both short and long form." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pvlink import RemoteRenderer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(RemoteRenderer.webserver_arguments_help())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For example, `active_renderer = RemoteRenderer(port=8080)` and `active_renderer = RemoteRenderer(p=8080)` would both set the server to start on port 8080.\n", - "\n", - "You can also pass no arguments. In that case, the next free port starting from 8080 will be chosen and a random authKey will be generated for you." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using RemoteRenderer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> If you are trying this notebook out on Binder, you need to use [jupyter server proxy](#Using-jupyter-server-proxy)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "renderer = RemoteRenderer()\n", - "display(renderer)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('renderer port:\\t', renderer.port)\n", - "print('renderer authKey:', renderer.authKey)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The window that appears will be blank since there are no views or sources. These can be created using ParaView's python module." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from paraview import simple\n", - "from pvlink.utility import SetRecommendedRenderSettings\n", - "\n", - "# Create a view and...\n", - "view1 = simple.CreateView('RenderView', 'view1')\n", - "# ...disable interactor-based render calls and\n", - "# ensure pvserver-side rendering (if applicable)\n", - "SetRecommendedRenderSettings(view1)\n", - "# Create and show a source\n", - "source1 = simple.Cone()\n", - "simple.Show(source1, view1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Update the renderer widget to display the changes\n", - "renderer.update_render()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple views" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can create more than one view in ParaView. Per default, a `RemoteRenderer`will show the active view." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(renderer.viewID) # viewID = -1 will always show active view" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a second view\n", - "view2 = simple.CreateView('RenderView', 'view2')\n", - "view2.Background = [0,0,0]\n", - "SetRecommendedRenderSettings(view2)\n", - "# And show a different source in it\n", - "source2 = simple.Sphere()\n", - "simple.Show(source2, view2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The renderer will now show the second view, since it is the currently active one." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "renderer.update_render()\n", - "display(renderer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want a `RemoteRenderer` to show a fixed view, regardless of which view is active, you can do so by setting its viewID." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "renderer.viewID = view2.GetGlobalIDAsString()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Changing the active view will now not change the view in the `RemoteRenderer` anymore." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "simple.SetActiveView(view1)\n", - "renderer.update_render()\n", - "display(renderer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using jupyter server proxy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`pvlink` supports the usage of [jupyter server proxy](https://github.com/jupyterhub/jupyter-server-proxy). If your notebook is not running locally and you cannot or do not want to tunnel the ParaViewWeb server to your local workstation, you should use *jupyter server proxy*.\n", - "\n", - "To do so, you need to specify the baseURL behind which your notebook is running in the baseURL initialization argument of your `RemoteRenderer`.\n", - "> *Example:* If your notebook is running at http://localhost:8888 and you would access a process running on port 1234 via http://localhost:8888/proxy/1234, the baseURL would be the part before \"proxy\", localhost:8888.\n", - "\n", - "If your notebook is running on HTTPS, set `useJupyterServerProxyHttps=True` to use the HTTPS certificates of the notebook server. This is necessary and keeps the connection between the client browser and the (jupyter server) proxy encrypted.\n", - "You also need to set `disableExternalPort=True` in order to disable port checking during the WebSocket opening handshake. Otherwise, the connection will fail with a port mismatch error as the notebook and the webserver do not run on the same port." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For example, for a notebook running on https://jupyter-jsc.fz-juelich.de, the `RemoteRenderer` would be setup like this:\n", - "```proxied_renderer = RemoteRenderer(baseURL='jupyter-jsc.fz-juelich.de/user/<user>/<workspace>', \n", - " disableExternalPort=True,\n", - " useJupyterServerProxyHttps=True)```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# You will most likely have to change the baseURL to the URL at which your notebook server is running\n", - "proxied_renderer = RemoteRenderer(baseURL='localhost:8888', \n", - " disableExternalPort=True,\n", - " useJupyterServerProxy=True) # useJupyterServerProxyHttps if https" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For more information on how to use the `RemoteRenderer`, see the [RemoteRenderer section](#RemoteRenderer) of this notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from paraview import simple\n", - "from pvlink.utility import SetRecommendedRenderSettings\n", - "\n", - "# Create a view and...\n", - "view3 = simple.CreateView('RenderView', 'view3')\n", - "# ...disable interactor-based render calls and\n", - "# ensure pvserver-side rendering (if applicable)\n", - "SetRecommendedRenderSettings(view3)\n", - "# Create and show a source\n", - "source3 = simple.Box()\n", - "simple.Show(source3, view3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "proxied_renderer.viewID = view3.GetGlobalIDAsString()\n", - "display(proxied_renderer)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "PyParaView-5.8", - "language": "python", - "name": "pyparaview-5.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/catalyst.ipynb b/notebooks/catalyst.ipynb deleted file mode 100644 index f5f0966..0000000 --- a/notebooks/catalyst.ipynb +++ /dev/null @@ -1,383 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img src=\"https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/raw/JupyterCon2020/img/logo.png\"\n", - " style=\"float:right; width:25%; height:25%; margin-top:25px;\">\n", - "\n", - "# Jupyter for interactive In-Situ Visualization with ParaView/Catalyst\n", - "\n", - "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.version.fz-juelich.de%2Fgrosch1%2Fpvlink_demo_for_jupytercon/JupyterCon2020) \n", - "Try out the *pvlink* extension and the example notebooks in binder." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Catalyst example" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import ipywidgets as widgets\n", - "\n", - "from paraview import simple\n", - "from pvlink import RemoteRenderer\n", - "from pvlink.utility import SetRecommendedRenderSettings, ResetCamera" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Start a pvserver" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "%%bash --bg --proc server_process\n", - "export OMP_NUM_THREADS=1\n", - "pkill -f pvserver", - "pvserver --server-port=11223 > ${JUPYTER_LOG_DIR}/pvserver.log 2>&1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Start the Catalyst enabled simulation" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%%bash --bg --proc catalyst_process\n", - "export OMP_NUM_THREADS=1\n", - "pkill -f pvpython", - "cd CatalystEnabledSimulation\n", - "pvpython ./fedriver.py ./cpscript.py > ${JUPYTER_LOG_DIR}/simulation.log 2>&1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup the RemoteRenderer" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "jupyter_url = 'jupyter-jsc.fz-juelich.de' + os.environ.get('JUPYTERHUB_SERVICE_PREFIX', '/')\n", - "renderer = RemoteRenderer(pvserverHost='localhost', pvserverPort = 11223, \n", - " baseURL=jupyter_url, \n", - " useJupyterServerProxyHttps=True, disableExternalPort=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a view\n", - "view1 = simple.FindViewOrCreate('view1', 'RenderView')\n", - "SetRecommendedRenderSettings(view1)\n", - "view1.Background = [0, 0, 0]\n", - "view1.ShowAnnotation = 1\n", - "renderer.viewID = view1.GetGlobalIDAsString()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Establish a Catalyst connection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> Currently, this uses a custom python library patched into ParaView to enable establishing Catayst connections with python without a GUI interface. \n", - "> Starting from ParaView 5.9, a Catalyst python library capable of such a thing should be included by default." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "catalyst = simple.CatalystConnection()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# open port for catalyst connection\n", - "catalyst.Start()\n", - "catalyst.AddUpdateFunction(renderer.update_render)\n", - "catalyst.BlockTillConnected();" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# wait till simulation connected\n", - "catalyst.BlockTillConnected()\n", - "# extract data from simulation\n", - "# supplying a source name, that can be used to find the ParaView source.\n", - "# In case of different named input, or multiple input ports, alows to choose the desired input, that should be extracted\n", - "extract = catalyst.Extract('extract')\n", - "# block till there is an update for the simulation data\n", - "catalyst.BlockTillNextUpdate()\n", - "# display simulation data\n", - "simple.SetActiveSource(extract)\n", - "extractDisplay = simple.Show(extract, view1)\n", - "\n", - "ResetCamera(view1, renderer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Handle data with ParaView" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# set scalar coloring\n", - "simple.ColorBy(extractDisplay, ('CELLS', 'pressure'))\n", - "\n", - "# rescale color and/or opacity maps used to include current data range\n", - "extractDisplay.RescaleTransferFunctionToDataRange(True, False)\n", - "\n", - "# show color bar/color legend\n", - "extractDisplay.SetScalarBarVisibility(view1, True)\n", - "\n", - "# get color transfer function/color map for 'pressure'\n", - "pressureLUT = simple.GetColorTransferFunction('pressure')\n", - "pressureLUT.RescaleTransferFunction(0.0, 1.0)\n", - "pressureLUT.ApplyPreset('Rainbow Desaturated', True)\n", - "\n", - "# get opacity transfer function/opacity map for 'pressure'\n", - "pressurePWF = simple.GetOpacityTransferFunction('pressure')\n", - "pressurePWF.RescaleTransferFunction(0.0, 1.0)\n", - "\n", - "# change representation type, for example wireframe or volume rendering\n", - "extractDisplay.SetRepresentationType('Wireframe');\n", - "# extractDisplay.SetRepresentationType('Volume');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup interacts with ipywidgets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Set representation" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dropdown = widgets.Dropdown(\n", - " options=['Wireframe', 'Volume'],\n", - "# value='Wireframe',\n", - " description='Representation:',\n", - " style={'description_width': '100pt'}\n", - ")\n", - "\n", - "def change_representation(change):\n", - " if change['new'] == 'Wireframe':\n", - " extractDisplay.SetRepresentationType('Wireframe')\n", - " elif change['new'] == 'Volume':\n", - " extractDisplay.SetRepresentationType('Volume')\n", - " \n", - "dropdown.observe(change_representation, 'value')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Pause/unpause" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "pause_button = widgets.Button(\n", - " description='Pause',\n", - " button_style='warning',\n", - " tooltip='Pause catalyst simulation',\n", - " icon='pause',\n", - " disabled=False\n", - ")\n", - "unpause_button = widgets.Button(\n", - " description='Unpause',\n", - " button_style='success', \n", - " tooltip='Unpause catalyst simulation',\n", - " icon='play',\n", - " disabled=True\n", - ")\n", - "\n", - "def pause(button):\n", - " pause_button.disabled = True\n", - " unpause_button.disabled = False\n", - " catalyst.SetPauseSimulation(True)\n", - "\n", - "def unpause(button):\n", - " pause_button.disabled = False\n", - " unpause_button.disabled = True\n", - " catalyst.SetPauseSimulation(False)\n", - "\n", - "pause_button.on_click(pause)\n", - "unpause_button.on_click(unpause)\n", - "\n", - "buttons = widgets.HBox([unpause_button, pause_button])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Show timestep" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from threading import Thread\n", - "from time import sleep\n", - "\n", - "timestep = widgets.Label(\n", - " value=\"timestep: 0\"\n", - ")\n", - "\n", - "def show_timestep(widget):\n", - " while True:\n", - " step = catalyst.GetTimeStep()\n", - " widget.value = \"timestep: {}\".format(step)\n", - " sleep(0.5)\n", - " \n", - "thread = Thread(target=show_timestep, args=(timestep,))\n", - "thread.start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Display widgets and renderer" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "widget_layout = widgets.HBox(children=[dropdown, buttons, timestep],\n", - " layout={'margin': '4px', 'justify_content': 'space-between'})\n", - "renderer.layout.height = '100%'" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "26cddb46ff914ff7ac23810181efc442", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(Dropdown(description='Representation:', options=('Wireframe', 'Volume'), style=D…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "widgets.VBox(children=[widget_layout, renderer], layout={'height': '800px'}) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "PyParaView-5.8", - "language": "python", - "name": "pyparaview-5.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/custom_protocol.ipynb b/notebooks/custom_protocol.ipynb deleted file mode 100644 index 74bd680..0000000 --- a/notebooks/custom_protocol.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img src=\"https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/raw/JupyterCon2020/img/logo.png\"\n", - " style=\"float:right; width:25%; height:25%; margin-top:25px;\">\n", - "\n", - "# Jupyter for interactive In-Situ Visualization with ParaView/Catalyst\n", - "\n", - "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.version.fz-juelich.de%2Fgrosch1%2Fpvlink_demo_for_jupytercon/JupyterCon2020) \n", - "Try out the *pvlink* extension and the example notebooks in binder." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using custom protocols" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can define your own pipeline which should be run on server start. It will then automically run when the ParaViewWeb server starts up. \n", - "This is equivalent to defining a pipeline in an external pv_server.py file (see the [SimpleRenderer](basic_usage.ipynb#SimpleRenderer))." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To define your custom pipeline, first you need define a class which inherits from `pv_wslink.PVServerProtocol` and add your pipeline there. Per default, the `RemoteRenderer` shows the active view. To ensure that the view you created in the pipeline is the one shown in the rendering widget and does not get replaced by a new active view, we need to make it available to the outside and later on bind the viewID to the rendering widget." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from paraview import simple\n", - "from paraview.web import pv_wslink\n", - "from paraview.web import protocols as pv_protocols\n", - "\n", - "from pvlink.utility import SetRecommendedRenderSettings\n", - "\n", - "\n", - "class CustomServer(pv_wslink.PVServerProtocol):\n", - " authKey = 'wslink-secret'\n", - "\n", - " def initialize(self):\n", - " # Bring used components\n", - " self.registerVtkWebProtocol(pv_protocols.ParaViewWebMouseHandler())\n", - " self.registerVtkWebProtocol(pv_protocols.ParaViewWebViewPort())\n", - " self.registerVtkWebProtocol(pv_protocols.ParaViewWebViewPortImageDelivery())\n", - " # Update authentication key to use\n", - " self.updateSecret(CustomServer.authKey)\n", - "\n", - " # Your pipeline\n", - " custom_view = simple.CreateView('RenderView', 'SphereView')\n", - " SetRecommendedRenderSettings(custom_view)\n", - " custom_viewID = custom_view.GetGlobalIDAsString()\n", - " # Make the viewID available so we can bind our widget to the correct view\n", - " self.setSharedObject('viewID', custom_viewID)\n", - " sphere = simple.Sphere()\n", - " simple.Show(sphere, custom_view)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pvlink import RemoteRenderer\n", - "\n", - "custom_renderer = RemoteRenderer(protocol=CustomServer, a='mysecretkey')\n", - "# Bind the viewID to the widget to avoid it showing a different view\n", - "# when a different view is set to the active view\n", - "custom_renderer.viewID = custom_renderer.protocol.getSharedObject('viewID')\n", - "display(custom_renderer)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/large_dataset.ipynb b/notebooks/large_dataset.ipynb deleted file mode 100644 index 2479482..0000000 --- a/notebooks/large_dataset.ipynb +++ /dev/null @@ -1,577 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img src=\"https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/raw/JupyterCon2020/img/logo.png\"\n", - " style=\"float:right; width:25%; height:25%; margin-top:25px;\">\n", - "\n", - "# Jupyter for interactive In-Situ Visualization with ParaView/Catalyst\n", - "\n", - "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.version.fz-juelich.de%2Fgrosch1%2Fpvlink_demo_for_jupytercon/JupyterCon2020) \n", - "Try out the *pvlink* extension and the example notebooks in binder." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Large dataset with a parallel `pvserver`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Start a parallel ParaView server on the command line, for example via `$ mpirun -np <numberOfProc> ./pvserver`.\n", - "\n", - "In this example, 64 compute nodes were used for a dataset of approximatly 1.2TB.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import ipywidgets as widgets\n", - "import os\n", - "import pvlink\n", - "\n", - "from paraview.simple import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup pvlink renderer\n", - "We are using *jupyter server proxy* to access our ParaViewWeb server since it is running on the HPC system." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "renderer = pvlink.RemoteRenderer(\n", - " baseURL='jupyter-jsc.fz-juelich.de'+os.environ['JUPYTERHUB_SERVICE_PREFIX'], \n", - " disableExternalPort=True, useJupyterServerProxyHttps=True,\n", - " pvserverHost=\"localhost\", pvserverPort=11111,\n", - " timeout=\"0\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup paraview pipeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup RenderView" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "renderView = CreateView('RenderView', 'view')\n", - "pvlink.utility.SetRecommendedRenderSettings(renderView)\n", - "\n", - "renderView.Background = [0, 0, 0]\n", - "renderView.OrientationAxesVisibility = 0\n", - "renderView.ShowAnnotation = 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Read .xmf file" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "box2xmf = XDMFReader(FileNames=['./visu/box2c.xmf'])\n", - "box2xmf.GridStatus = ['Structured Grid']\n", - "box2xmf.UpdatePipeline()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# box2xmfDisplay = Show(box2xmf, renderView)\n", - "# box2xmfDisplay.SetRepresentationType('Volume')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Hide(box2xmf, renderView)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Apply filters" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "contour = Contour(Input=box2xmf)\n", - "contour.Isosurfaces = [0.3]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "contourDisplay = Show(contour, renderView, 'GeometryRepresentation')\n", - "contourDisplay.SetRepresentationType('Surface')\n", - "contourDisplay.RescaleTransferFunctionToDataRange(True, False)\n", - "contourDisplay.SetScalarBarVisibility(renderView, True);" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "ColorBy(contourDisplay, ('POINTS', 'PS'))\n", - "psLUT = GetColorTransferFunction('PS')\n", - "psLUT.ApplyPreset('Blue Orange (divergent)', True);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reset camera and focal point and display renderer" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "pvlink.utility.ResetCamera(renderView, renderer)\n", - "renderer.update_render()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9b848c6e88764ef3b4ee04b406a3e7a1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Box(children=(RemoteRenderer(authKey='1da0ea24ad20daada608fc5de87325fb709b07fb8816cb7e', sessionURL='wss://jup…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "renderContainer = widgets.Box(children=[renderer], layout={'height': '800px'})\n", - "display(renderContainer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Print memory usage information" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "dataInfo = box2xmf.GetDataInformation()\n", - "\n", - "memory_size = dataInfo.DataInformation.GetMemorySize()\n", - "number_points = dataInfo.DataInformation.GetNumberOfPoints()\n", - "number_cells = dataInfo.DataInformation.GetNumberOfCells()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from paraview import benchmark\n", - "memuse = benchmark.logbase.get_memuse()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of points:\t 77976270099\n", - "Number of cells:\t 77629109375\n", - "Memory size:\t\t 1218379428\n" - ] - } - ], - "source": [ - "print(\"Number of points:\\t\", number_points)\n", - "print(\"Number of cells:\\t\", number_cells)\n", - "print(\"Memory size:\\t\\t\", memory_size)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CL[0] 252244 / 52058712\n", - "DS_RS[0] 9798604 / 52058712\n", - "DS_RS[1] 9676520 / 52058712\n", - "DS_RS[2] 9675744 / 52058712\n", - "DS_RS[3] 9698376 / 52058712\n", - "DS_RS[4] 9674232 / 51420436\n", - "DS_RS[5] 9698396 / 51420436\n", - "DS_RS[6] 9698368 / 51420420\n", - "DS_RS[7] 9720144 / 51420420\n", - "DS_RS[8] 9677052 / 49780008\n", - "DS_RS[9] 9698408 / 49780008\n", - "DS_RS[10] 9698244 / 49780008\n", - "DS_RS[11] 9720116 / 49780008\n", - "DS_RS[12] 9677580 / 52932288\n", - "DS_RS[13] 9698372 / 52932288\n", - "DS_RS[14] 10184256 / 52932288\n", - "DS_RS[15] 9720208 / 52932288\n", - "DS_RS[16] 9675208 / 51310944\n", - "DS_RS[17] 9698412 / 51310944\n", - "DS_RS[18] 9698252 / 51310944\n", - "DS_RS[19] 9720132 / 51310944\n", - "DS_RS[20] 9676176 / 50058232\n", - "DS_RS[21] 9698400 / 50058232\n", - "DS_RS[22] 9698252 / 50058232\n", - "DS_RS[23] 9720176 / 50058232\n", - "DS_RS[24] 9698896 / 51642404\n", - "DS_RS[25] 9719724 / 51642404\n", - "DS_RS[26] 9694356 / 51642404\n", - "DS_RS[27] 9717364 / 51642404\n", - "DS_RS[28] 9696288 / 49589292\n", - "DS_RS[29] 9717012 / 49589292\n", - "DS_RS[30] 9698384 / 49589292\n", - "DS_RS[31] 9720068 / 49589292\n", - "DS_RS[32] 9674236 / 51590984\n", - "DS_RS[33] 9697320 / 51590984\n", - "DS_RS[34] 9695640 / 51590984\n", - "DS_RS[35] 9720200 / 51590984\n", - "DS_RS[36] 9669292 / 51414880\n", - "DS_RS[37] 9690744 / 51414880\n", - "DS_RS[38] 9690856 / 51414880\n", - "DS_RS[39] 9712580 / 51414880\n", - "DS_RS[40] 9698872 / 51644772\n", - "DS_RS[41] 9721652 / 51644772\n", - "DS_RS[42] 9698368 / 51644772\n", - "DS_RS[43] 9720204 / 51644772\n", - "DS_RS[44] 9691768 / 51275920\n", - "DS_RS[45] 9712468 / 51275920\n", - "DS_RS[46] 9691184 / 51275920\n", - "DS_RS[47] 9713080 / 51275920\n", - "DS_RS[48] 9698792 / 49737408\n", - "DS_RS[49] 9719596 / 49737408\n", - "DS_RS[50] 9695728 / 49737408\n", - "DS_RS[51] 9720204 / 49737408\n", - "DS_RS[52] 9691736 / 49641216\n", - "DS_RS[53] 9709584 / 49641216\n", - "DS_RS[54] 9690940 / 49641216\n", - "DS_RS[55] 9713032 / 49641216\n", - "DS_RS[56] 9717404 / 49663596\n", - "DS_RS[57] 9719620 / 49663596\n", - "DS_RS[58] 9719616 / 49663596\n", - "DS_RS[59] 9720208 / 49663596\n", - "DS_RS[60] 9713104 / 51323968\n", - "DS_RS[61] 9712532 / 51323968\n", - "DS_RS[62] 9712552 / 51323968\n", - "DS_RS[63] 9712944 / 51323968\n", - "DS_RS[64] 9672880 / 51159524\n", - "DS_RS[65] 9698396 / 51159524\n", - "DS_RS[66] 9698324 / 51159524\n", - "DS_RS[67] 9720192 / 51159524\n", - "DS_RS[68] 9677648 / 51810388\n", - "DS_RS[69] 9698304 / 51810388\n", - "DS_RS[70] 9698244 / 51810388\n", - "DS_RS[71] 9720100 / 51810388\n", - "DS_RS[72] 9698928 / 51732124\n", - "DS_RS[73] 9719588 / 51732124\n", - "DS_RS[74] 9698388 / 51732124\n", - "DS_RS[75] 9720108 / 51732124\n", - "DS_RS[76] 9698844 / 51468060\n", - "DS_RS[77] 9716976 / 51468060\n", - "DS_RS[78] 9698264 / 51468060\n", - "DS_RS[79] 9720196 / 51468060\n", - "DS_RS[80] 9698884 / 51033504\n", - "DS_RS[81] 9719728 / 51033504\n", - "DS_RS[82] 9698376 / 51033504\n", - "DS_RS[83] 9720200 / 51033504\n", - "DS_RS[84] 9691768 / 51860072\n", - "DS_RS[85] 9710932 / 51860072\n", - "DS_RS[86] 9689360 / 51860072\n", - "DS_RS[87] 9713036 / 51860072\n", - "DS_RS[88] 9720236 / 51843416\n", - "DS_RS[89] 9719720 / 51843416\n", - "DS_RS[90] 9719712 / 51843416\n", - "DS_RS[91] 9720080 / 51843416\n", - "DS_RS[92] 9713016 / 48787168\n", - "DS_RS[93] 9710848 / 48787168\n", - "DS_RS[94] 9712500 / 48787168\n", - "DS_RS[95] 9713080 / 48787168\n", - "DS_RS[96] 9677500 / 48855676\n", - "DS_RS[97] 9698372 / 48855676\n", - "DS_RS[98] 9698340 / 48855676\n", - "DS_RS[99] 9718912 / 48855676\n", - "DS_RS[100] 9670576 / 49831920\n", - "DS_RS[101] 9691232 / 49831920\n", - "DS_RS[102] 9689340 / 49831920\n", - "DS_RS[103] 9713028 / 49831920\n", - "DS_RS[104] 9698844 / 49828244\n", - "DS_RS[105] 9719536 / 49828244\n", - "DS_RS[106] 9691128 / 49828244\n", - "DS_RS[107] 9711152 / 49828244\n", - "DS_RS[108] 9698784 / 51216260\n", - "DS_RS[109] 9719548 / 51216260\n", - "DS_RS[110] 9691236 / 51216260\n", - "DS_RS[111] 9712912 / 51216260\n", - "DS_RS[112] 9698804 / 51298720\n", - "DS_RS[113] 9719716 / 51298720\n", - "DS_RS[114] 9691280 / 51298720\n", - "DS_RS[115] 9713080 / 51298720\n", - "DS_RS[116] 9691680 / 48907260\n", - "DS_RS[117] 9708536 / 48907260\n", - "DS_RS[118] 9684196 / 48907260\n", - "DS_RS[119] 9704272 / 48907260\n", - "DS_RS[120] 9718600 / 49117340\n", - "DS_RS[121] 9711960 / 49117340\n", - "DS_RS[122] 9719612 / 49117340\n", - "DS_RS[123] 9713084 / 49117340\n", - "DS_RS[124] 9713076 / 48831116\n", - "DS_RS[125] 9705408 / 48831116\n", - "DS_RS[126] 9712460 / 48831116\n", - "DS_RS[127] 9705860 / 48831116\n", - "DS_RS[128] 9676884 / 50678972\n", - "DS_RS[129] 9698224 / 50678972\n", - "DS_RS[130] 9698328 / 50678972\n", - "DS_RS[131] 9720160 / 50678972\n", - "DS_RS[132] 9677420 / 51381432\n", - "DS_RS[133] 9698264 / 51381432\n", - "DS_RS[134] 9698276 / 51381432\n", - "DS_RS[135] 9720020 / 51381432\n", - "DS_RS[136] 9698736 / 51225928\n", - "DS_RS[137] 9719544 / 51225928\n", - "DS_RS[138] 9698232 / 51225928\n", - "DS_RS[139] 9720144 / 51225928\n", - "DS_RS[140] 9698872 / 51284324\n", - "DS_RS[141] 9719628 / 51284324\n", - "DS_RS[142] 9698204 / 51284324\n", - "DS_RS[143] 9720152 / 51284324\n", - "DS_RS[144] 9698776 / 50828104\n", - "DS_RS[145] 9719588 / 50828104\n", - "DS_RS[146] 9698244 / 50828104\n", - "DS_RS[147] 9720100 / 50828104\n", - "DS_RS[148] 9691396 / 49845004\n", - "DS_RS[149] 9712592 / 49845004\n", - "DS_RS[150] 9689492 / 49845004\n", - "DS_RS[151] 9712968 / 49845004\n", - "DS_RS[152] 9720144 / 51092756\n", - "DS_RS[153] 9719624 / 51092756\n", - "DS_RS[154] 9719644 / 51092756\n", - "DS_RS[155] 9718448 / 51092756\n", - "DS_RS[156] 9713048 / 51037760\n", - "DS_RS[157] 9712272 / 51037760\n", - "DS_RS[158] 9712520 / 51037760\n", - "DS_RS[159] 9713080 / 51037760\n", - "DS_RS[160] 9677612 / 51089532\n", - "DS_RS[161] 9698364 / 51089532\n", - "DS_RS[162] 9695624 / 51089532\n", - "DS_RS[163] 9720140 / 51089532\n", - "DS_RS[164] 9670500 / 48790088\n", - "DS_RS[165] 9691208 / 48790088\n", - "DS_RS[166] 9691220 / 48790088\n", - "DS_RS[167] 9713116 / 48790088\n", - "DS_RS[168] 9698808 / 48594688\n", - "DS_RS[169] 9716916 / 48594688\n", - "DS_RS[170] 9698248 / 48594688\n", - "DS_RS[171] 9720060 / 48594688\n", - "DS_RS[172] 9691672 / 50636688\n", - "DS_RS[173] 9709812 / 50636688\n", - "DS_RS[174] 9691236 / 50636688\n", - "DS_RS[175] 9713044 / 50636688\n", - "DS_RS[176] 9698924 / 50641724\n", - "DS_RS[177] 9719672 / 50641724\n", - "DS_RS[178] 9691148 / 50641724\n", - "DS_RS[179] 9713084 / 50641724\n", - "DS_RS[180] 9691624 / 50718188\n", - "DS_RS[181] 9712604 / 50718188\n", - "DS_RS[182] 9683772 / 50718188\n", - "DS_RS[183] 9705944 / 50718188\n", - "DS_RS[184] 9717532 / 50789876\n", - "DS_RS[185] 9719616 / 50789876\n", - "DS_RS[186] 9710864 / 50789876\n", - "DS_RS[187] 9713076 / 50789876\n", - "DS_RS[188] 9713056 / 51567720\n", - "DS_RS[189] 9712428 / 51567720\n", - "DS_RS[190] 9705416 / 51567720\n", - "DS_RS[191] 9705932 / 51567720\n", - "DS_RS[192] 9696144 / 50879132\n", - "DS_RS[193] 9719580 / 50879132\n", - "DS_RS[194] 9698316 / 50879132\n", - "DS_RS[195] 9720188 / 50879132\n", - "DS_RS[196] 9698836 / 50921564\n", - "DS_RS[197] 9719644 / 50921564\n", - "DS_RS[198] 9698328 / 50921564\n", - "DS_RS[199] 9720088 / 50921564\n", - "DS_RS[200] 9720240 / 51132636\n", - "DS_RS[201] 9718224 / 51132636\n", - "DS_RS[202] 9718364 / 51132636\n", - "DS_RS[203] 9720080 / 51132636\n", - "DS_RS[204] 9713048 / 51120284\n", - "DS_RS[205] 9712084 / 51120284\n", - "DS_RS[206] 9712548 / 51120284\n", - "DS_RS[207] 9711052 / 51120284\n", - "DS_RS[208] 9694848 / 51034020\n", - "DS_RS[209] 9716972 / 51034020\n", - "DS_RS[210] 9691272 / 51034020\n", - "DS_RS[211] 9712964 / 51034020\n", - "DS_RS[212] 9698800 / 50889524\n", - "DS_RS[213] 9719720 / 50889524\n", - "DS_RS[214] 9688496 / 50889524\n", - "DS_RS[215] 9713064 / 50889524\n", - "DS_RS[216] 9720192 / 50753808\n", - "DS_RS[217] 9712608 / 50753808\n", - "DS_RS[218] 9716992 / 50753808\n", - "DS_RS[219] 9713068 / 50753808\n", - "DS_RS[220] 9710132 / 50826220\n", - "DS_RS[221] 9705480 / 50826220\n", - "DS_RS[222] 9712432 / 50826220\n", - "DS_RS[223] 9705868 / 50826220\n", - "DS_RS[224] 9698164 / 50808660\n", - "DS_RS[225] 9718752 / 50808660\n", - "DS_RS[226] 9698192 / 50808660\n", - "DS_RS[227] 9718376 / 50808660\n", - "DS_RS[228] 9691588 / 51107600\n", - "DS_RS[229] 9712548 / 51107600\n", - "DS_RS[230] 9691088 / 51107600\n", - "DS_RS[231] 9713036 / 51107600\n", - "DS_RS[232] 9720056 / 50889936\n", - "DS_RS[233] 9718840 / 50889936\n", - "DS_RS[234] 9712396 / 50889936\n", - "DS_RS[235] 9713032 / 50889936\n", - "DS_RS[236] 9713040 / 50851668\n", - "DS_RS[237] 9712536 / 50851668\n", - "DS_RS[238] 9705040 / 50851668\n", - "DS_RS[239] 9703748 / 50851668\n", - "DS_RS[240] 9698196 / 50812000\n", - "DS_RS[241] 9719600 / 50812000\n", - "DS_RS[242] 9691052 / 50812000\n", - "DS_RS[243] 9712932 / 50812000\n", - "DS_RS[244] 9691684 / 50970684\n", - "DS_RS[245] 9712556 / 50970684\n", - "DS_RS[246] 9684000 / 50970684\n", - "DS_RS[247] 9705808 / 50970684\n", - "DS_RS[248] 9716764 / 51058112\n", - "DS_RS[249] 9710644 / 51058112\n", - "DS_RS[250] 9712504 / 51058112\n", - "DS_RS[251] 9705808 / 51058112\n", - "DS_RS[252] 9712396 / 51180408\n", - "DS_RS[253] 9705380 / 51180408\n", - "DS_RS[254] 9704824 / 51180408\n", - "DS_RS[255] 9695424 / 51180408\n" - ] - } - ], - "source": [ - "for use in memuse:\n", - " print(use)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Disconnect()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "PyParaView-5.8", - "language": "python", - "name": "pyparaview-5.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/minimal_example.ipynb b/notebooks/minimal_example.ipynb deleted file mode 100644 index af52b66..0000000 --- a/notebooks/minimal_example.ipynb +++ /dev/null @@ -1,157 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img src=\"https://gitlab.version.fz-juelich.de/grosch1/pvlink_demo_for_jupytercon/-/raw/JupyterCon2020/img/logo.png\"\n", - " style=\"float:right; width:25%; height:25%; margin-top:25px;\">\n", - "\n", - "# Jupyter for interactive In-Situ Visualization with ParaView/Catalyst\n", - "\n", - "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.version.fz-juelich.de%2Fgrosch1%2Fpvlink_demo_for_jupytercon/JupyterCon2020) \n", - "Try out the *pvlink* extension and the example notebooks in binder." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Minimal example" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pvlink\n", - "from paraview.simple import *\n", - "from pvlink.utility import SetRecommendedRenderSettings, ResetCamera" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "41063a5b5274476cb4ef2bfc580c5cd5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "RemoteRenderer(authKey='afd24933b4abc600d381b4a99e07b7edfd1b5ab55731cef5', sessionURL='wss://jupyter-jsc.fz-ju…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Create a RemoteRenderer to capture a ParaView RenderView\n", - "renderer1 = pvlink.RemoteRenderer()\n", - "\n", - "# Paraview Pipeline\n", - "# Create a RenderView\n", - "renderView1 = CreateView('RenderView', 'view1')\n", - "renderView1.Background = [0,0,0]\n", - "SetRecommendedRenderSettings(renderView1)\n", - "\n", - "# Load and display data\n", - "waveletElevation = XMLImageDataReader(FileName=['./data/waveletElevation.vti'])\n", - "waveletElevationDisplay = Show(waveletElevation, renderView1)\n", - "waveletElevationDisplay.SetRepresentationType('Volume')\n", - "\n", - "# Edit data display\n", - "ColorBy(waveletElevationDisplay, ('POINTS', 'RDataWithElevation', 'Y'))\n", - "rDataWithElevationLUT = GetColorTransferFunction('RDataWithElevation')\n", - "rDataWithElevationLUT.ApplyPreset('Cool to Warm (Extended)', True)\n", - "\n", - "# Set pvlink renderer to show renderView1\n", - "renderer1.viewID = renderView1.GetGlobalIDAsString()\n", - "ResetCamera(renderView1, renderer1)\n", - "display(renderer1)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b2dd3f1af11746389fbfd728c020989d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "RemoteRenderer(authKey='wslink-secret', sessionURL='ws://localhost:1234/ws', viewID='577')" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Create a second RemoteRenderer to capture a second ParaView RenderView\n", - "renderer2 = pvlink.RemoteRenderer(port=1234, authKey='wslink-secret')\n", - "\n", - "# Paraview Pipeline\n", - "# Create a second RenderView\n", - "renderView2 = CreateView('RenderView', 'view2')\n", - "renderView2.Background = [0,0,0]\n", - "renderView2.ShowAnnotation = 1\n", - "SetRecommendedRenderSettings(renderView2)\n", - "\n", - "# Load and display data\n", - "waveletMaterial = XMLImageDataReader(FileName=['./data/waveletMaterial.vti'])\n", - "waveletMaterialDisplay = Show(waveletMaterial, renderView2)\n", - "waveletMaterialDisplay.SetRepresentationType('Volume')\n", - "\n", - "# Edit data display\n", - "materialLUT = GetColorTransferFunction('Material')\n", - "materialLUT.ApplyPreset('Cool to Warm (Extended)', True)\n", - "\n", - "# Set secon dpvlink renderer to show renderView2\n", - "renderer2.viewID = renderView2.GetGlobalIDAsString()\n", - "ResetCamera(renderView2, renderer2)\n", - "display(renderer2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "PyParaView-5.8", - "language": "python", - "name": "pyparaview-5.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} -- GitLab