{section: This page has useful classad tranform rules.}
 
+use by saving each as a file, and passing that file to condor_transform_ads like this:
+{term}
+condor_transform_ads -rules to_docker.xfm -in vanilla_jobs.ads -out docker_jobs.ads
+{endterm}
+
 {subsubsection: Convert job to docker job}
 Invoke with Image=<image-name> to override default docker image
 
@@ -100,3 +105,114 @@
   X86_64 FREEBSD FreeBSD10   1003 FreeBSD     10 FreeBSD FREEBSD
 )
 {endsnip}
+
+{subsubsection: Generate simulated dynamic slots from a partitionable slot}
+Converts a partitionable STARTD ads from a single machine, into a partitionable slot ad and multiple dynamic slot ads.  It does *NOT* properly adjust the partitionable slot ad to account for resources consumed by the dynamic slot ads.
+Invoke with
+*: DOMAIN=x.y.z  set the default domain for generated machine names
+*: User=bob      set the name of the simulated user for the dynamic slots
+*: NumDynSlots=N control the number of dynamic slots
+*: ReqMem=NN     set the memory assigned to the dynamic slots
+
+{snip: to_dyn_slots.xfm}
+# Simulate one or more active dynamic slots from an idle partitionable one
+# The original partitionable slot is passed through untransfomed followed
+# by N partitionable slots by the TRANSFORM N+1 statement
+#
+
+# this trick currently results in infinite loop... if they are self-references <sigh>
+Client = $(Client:submit.chtc.wisc.edu)
+User   = $(User:bob)
+ReqMem = $(ReqMem:4000)
+NumDynSlots = $(NumDynSlots:1)
+
+#IpAddr = split(MyAddress,"<?>&")[0]
+EVALMACRO AddrIp = $(My.AddressV1)[0].a
+EVALMACRO AddrPort = $(My.AddressV1)[0].port
+EVALMACRO Slot = splitslotname(Name)[0]
+
+#CurrentTime = time()
+#CurrentTime = $EVAL(CurrentTime)
+EVALMACRO CurrentTime time()
+
+SET MyCurrentTime = $(CurrentTime)
+DELETE /^Updates.+/
+if defined UPDATE
+   SET UpdateSequenceNumber $(Update)
+endif
+
+if defined DOMAIN
+  EVALMACRO Host = split("$(My.Machine)",".")[0]
+  SET Machine "$(Host).$F(DOMAIN)"
+  SET Name "$(Slot)@$(Host).$F(DOMAIN)"
+endif
+
+SET ClassAdLifetime 600
+
+if $(Step)
+  # Convert partitionable slot to dynamic slot
+  #
+  SET NAME  "$(Slot)_$(Step)@$(My.Machine)"
+  DELETE PartitionableSlot
+  DELETE NumDynamicSlots
+  DELETE /^Child.+/
+  SET ParentSlotId  $(My.SlotId)
+  SET DynamicSlot   true
+  SET SlotType      "Dynamic"
+  SET SlotTypeId    -1
+  SET Activity      "Busy"
+  SET State         "Claimed"
+  SET PublicClaimId "<$(AddrIp):$(AddrPort)>#$(CurrentTime)#$RANDOM_INTEGER(10000,20000,1)#..."
+
+  # set info about the executing job and claim
+  #
+  SET     JobId           "$RANDOM_INTEGER(11100,22200,1).0"
+  SET     JobUniverse     5
+  EVALSET JobStart        time() - 60*16
+  SET     NumPids         2
+  SET     GlobalJobId     "$(Client)#$(MY.JobId)#$(CurrentTime)"
+  SET     ImageSize       $RANDOM_INTEGER(100000,1000000,128)
+  SET     ExecutableSize  3
+  EVALSET ResidentSetSize ImageSize + $RANDOM_INTEGER(1000,10000,128)
+  COPY    JobStart EnteredCurrentState
+  COPY    JobStart EnteredCurrentActivity
+  EVALSET TotalClaimRunTime time() - EnteredCurrentState
+  COPY    TotalClaimRunTime TotalJobRunTime
+  COPY    TotalClaimRunTime TotalTimeClaimedBusy
+  SET     TotalTimeClaimedIdle 2
+  DELETE  TotalTimeDrainedRetiring
+  DELETE  TotalTimeUnclaimedIdle
+  DELETE  TotalTimeUnclaimedBenchmarking
+  EVALSET RetirementTimeRemaining 60*60*24*3 - TotalClaimRunTime
+
+  # set ownership
+  #
+  SET NiceUser      false
+  SET RemoteOwner   "$(User)@chtc.wisc.edu"
+  COPY RemoteOwner  RemoteUser
+  SET RemoteNegotiatingGroup "<none>"
+  SET RemoteAutoregroup false
+  SET ClientMachine "$(Client)"
+
+  # set resource usage
+  #
+  SET     Cpus      1
+  COPY    Cpus      TotalSlotCpus
+  SET     RequestMemory $(ReqMem)
+  EVALSET Memory    quantize($(ReqMem),256)
+  COPY    Memory    TotalSlotMemory
+  SET     MemoryUsage ((ResidentSetSize + 1023)/1024)
+  EVALSET Disk      Disk/40.0
+  COPY    Disk      TotalSlotDisk
+
+
+else
+
+  # Pass original Partitionable Slot through unmolested at step 0
+  # Should maybe subtract resource usage from it?
+
+
+endif
+
+TRANSFORM 1+$(NumDynSlots:1)
+{endsnip}